# utsapoddar/job_application_automation architecture

> Architecture diagram of the GitHub repository utsapoddar/job_application_automation, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-26). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/utsapoddar/job_application_automation
- Repository: https://github.com/utsapoddar/job_application_automation
- Video tour (about a minute): https://gitdiagram.com/utsapoddar/job_application_automation/video

## Overview

Job Bot discovers and scores postings, then prepares tailored application packets for human review; its scheduled pipeline does not submit applications. A separate approval-gated path can fill forms without submitting. The graph includes the documented discovery, packet-generation, tracking, and manual-fill capabilities. Source excerpts were partial, so links within unsampled subsystems follow README-documented responsibilities and omit uncertain internal wiring.

Main entry points: [`main.py`](https://github.com/utsapoddar/job_application_automation/blob/main/main.py) (Scheduled pipeline), [`db/models.py`](https://github.com/utsapoddar/job_application_automation/blob/main/db/models.py) (Job records), [`applicator/worker.py`](https://github.com/utsapoddar/job_application_automation/blob/main/applicator/worker.py) (Form-fill worker), [`resume_tailor/tailor.py`](https://github.com/utsapoddar/job_application_automation/blob/main/resume_tailor/tailor.py) (Resume tailoring)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_discovery["Job discovery"]
  node_main["Scheduled pipeline<br/>[main.py]"]
  node_direct["Direct URL intake<br/>[apply_to.py]"]
  node_scraper["Board discovery<br/>[engine.py]"]
  node_ingest["Email ingestion<br/>[imap_reader.py]"]
  node_webhook["Webhook ingestion<br/>[webhook.py]"]
  node_jd["JD retrieval<br/>[jd_fetcher.py]"]
end

subgraph group_generation["Packet generation"]
  node_tailor["Resume tailoring<br/>[tailor.py]"]
  node_cv360["CV360 review<br/>[resume_checker.py]"]
  node_cover["Cover letters<br/>[generator.py]"]
  node_docx["DOCX generation<br/>[docx_gen.py]"]
  node_packet["Application packet"]
end

subgraph group_operations["Tracking and review"]
  node_tracker["Application tracking<br/>[crud.py]"]
  node_notify["Notifications<br/>[notifier.py]"]
  node_csv["CSV export<br/>[export.py]"]
end

subgraph group_filling["Approved form filling"]
  node_approval["Fill approval<br/>[approved_fill.py]"]
  node_worker["Form-fill worker<br/>[worker.py]"]
  node_resolver["Field resolution<br/>[resolver.py]"]
end

subgraph group_shared["Shared services"]
  node_jobs[("Job records<br/>[models.py]")]
  node_llm["LLM tiers<br/>[interface.py]"]
  node_browser["Browser manager<br/>[manager.py]"]
end

node_operator(("Operator"))
node_boards(("Job boards"))
node_email(("Job-alert email"))
node_human(("Human reviewer"))
node_forms(("Employer forms"))
node_devant(("Devant CV360"))
node_llmservice(("LLM providers"))

node_boards -->|"provide postings"| node_scraper
node_email -->|"provide alerts"| node_ingest
node_main -->|"runs discovery"| node_scraper
node_main -->|"runs ingestion"| node_ingest
node_main -->|"reads and filters"| node_jobs
node_scraper -->|"stores jobs"| node_jobs
node_ingest -->|"stores jobs"| node_jobs
node_webhook -->|"stores jobs"| node_jobs
node_main -->|"scores titles"| node_llm
node_main -->|"retrieves descriptions"| node_jd
node_jd -->|"provides descriptions"| node_tailor
node_main -->|"prepares resumes"| node_tailor
node_tailor -->|"requests tailoring"| node_llm
node_tailor -->|"checks resume"| node_cv360
node_cv360 -->|"checks document"| node_devant
node_main -->|"generates letter"| node_cover
node_main -->|"generates document"| node_docx
node_main -->|"writes packet"| node_packet
node_main -->|"records ready status"| node_tracker
node_tracker -->|"updates records"| node_jobs
node_main -->|"sends review notice"| node_notify
node_main -->|"exports records"| node_csv
node_packet -->|"presents for review"| node_human
node_human -->|"authorizes one fill"| node_approval
node_approval -->|"starts approved run"| node_worker
node_worker -->|"opens browser"| node_browser
node_worker -->|"resolves fields"| node_resolver
node_worker -->|"navigates and fills"| node_forms
node_resolver -.->|"requests field answers"| node_llm
node_llm -.->|"calls configured backend"| node_llmservice

click node_main "https://github.com/utsapoddar/job_application_automation/blob/main/main.py"
click node_direct "https://github.com/utsapoddar/job_application_automation/blob/main/apply_to.py"
click node_scraper "https://github.com/utsapoddar/job_application_automation/blob/main/scraper/engine.py"
click node_ingest "https://github.com/utsapoddar/job_application_automation/blob/main/email_ingest/imap_reader.py"
click node_webhook "https://github.com/utsapoddar/job_application_automation/blob/main/email_ingest/webhook.py"
click node_jobs "https://github.com/utsapoddar/job_application_automation/blob/main/db/models.py"
click node_jd "https://github.com/utsapoddar/job_application_automation/blob/main/scraper/jd_fetcher.py"
click node_llm "https://github.com/utsapoddar/job_application_automation/blob/main/llm/interface.py"
click node_tailor "https://github.com/utsapoddar/job_application_automation/blob/main/resume_tailor/tailor.py"
click node_cv360 "https://github.com/utsapoddar/job_application_automation/blob/main/resume_tailor/resume_checker.py"
click node_cover "https://github.com/utsapoddar/job_application_automation/blob/main/cover_letter/generator.py"
click node_docx "https://github.com/utsapoddar/job_application_automation/blob/main/resume_tailor/docx_gen.py"
click node_packet "https://github.com/utsapoddar/job_application_automation/blob/main/application_packet.py"
click node_tracker "https://github.com/utsapoddar/job_application_automation/blob/main/tracker/crud.py"
click node_notify "https://github.com/utsapoddar/job_application_automation/blob/main/notifier.py"
click node_approval "https://github.com/utsapoddar/job_application_automation/blob/main/applicator/approved_fill.py"
click node_worker "https://github.com/utsapoddar/job_application_automation/blob/main/applicator/worker.py"
click node_resolver "https://github.com/utsapoddar/job_application_automation/blob/main/applicator/resolver.py"
click node_browser "https://github.com/utsapoddar/job_application_automation/blob/main/browser/manager.py"
click node_csv "https://github.com/utsapoddar/job_application_automation/blob/main/tracker/export.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_main,node_direct,node_scraper,node_ingest,node_webhook,node_jd,node_human toneBlue
class node_tailor,node_cv360,node_cover,node_docx,node_packet toneAmber
class node_tracker,node_notify,node_csv toneMint
class node_approval,node_worker,node_resolver toneRose
class node_jobs,node_llm,node_browser,node_operator,node_boards,node_email,node_forms,node_devant,node_llmservice toneIndigo
```

## Components

### Job discovery

- [Scheduled pipeline](https://github.com/utsapoddar/job_application_automation/blob/main/main.py): `main.py`
- [Direct URL intake](https://github.com/utsapoddar/job_application_automation/blob/main/apply_to.py): `apply_to.py`
- [Board discovery](https://github.com/utsapoddar/job_application_automation/blob/main/scraper/engine.py): `scraper/engine.py`
- [Email ingestion](https://github.com/utsapoddar/job_application_automation/blob/main/email_ingest/imap_reader.py): `email_ingest/imap_reader.py`
- [Webhook ingestion](https://github.com/utsapoddar/job_application_automation/blob/main/email_ingest/webhook.py): `email_ingest/webhook.py`
- [JD retrieval](https://github.com/utsapoddar/job_application_automation/blob/main/scraper/jd_fetcher.py): `scraper/jd_fetcher.py`

### Packet generation

- [Resume tailoring](https://github.com/utsapoddar/job_application_automation/blob/main/resume_tailor/tailor.py): `resume_tailor/tailor.py`
- [CV360 review](https://github.com/utsapoddar/job_application_automation/blob/main/resume_tailor/resume_checker.py): `resume_tailor/resume_checker.py`
- [Cover letters](https://github.com/utsapoddar/job_application_automation/blob/main/cover_letter/generator.py): `cover_letter/generator.py`
- [DOCX generation](https://github.com/utsapoddar/job_application_automation/blob/main/resume_tailor/docx_gen.py): `resume_tailor/docx_gen.py`
- [Application packet](https://github.com/utsapoddar/job_application_automation/blob/main/application_packet.py): `application_packet.py`

### Tracking and review

- [Application tracking](https://github.com/utsapoddar/job_application_automation/blob/main/tracker/crud.py): `tracker/crud.py`
- [Notifications](https://github.com/utsapoddar/job_application_automation/blob/main/notifier.py): `notifier.py`
- [CSV export](https://github.com/utsapoddar/job_application_automation/blob/main/tracker/export.py): `tracker/export.py`

### Approved form filling

- [Fill approval](https://github.com/utsapoddar/job_application_automation/blob/main/applicator/approved_fill.py): `applicator/approved_fill.py`
- [Form-fill worker](https://github.com/utsapoddar/job_application_automation/blob/main/applicator/worker.py): `applicator/worker.py`
- [Field resolution](https://github.com/utsapoddar/job_application_automation/blob/main/applicator/resolver.py): `applicator/resolver.py`

### Shared services

- [Job records](https://github.com/utsapoddar/job_application_automation/blob/main/db/models.py): `db/models.py`
- [LLM tiers](https://github.com/utsapoddar/job_application_automation/blob/main/llm/interface.py): `llm/interface.py`
- [Browser manager](https://github.com/utsapoddar/job_application_automation/blob/main/browser/manager.py): `browser/manager.py`

### Other components

- **Operator**
- **Job boards**
- **Job-alert email**
- **Human reviewer**
- **Employer forms**
- **Devant CV360**
- **LLM providers**

## Connections

- Job boards → Board discovery: provide postings
- Job-alert email → Email ingestion: provide alerts
- Scheduled pipeline → Board discovery: runs discovery
- Scheduled pipeline → Email ingestion: runs ingestion
- Scheduled pipeline → Job records: reads and filters
- Board discovery → Job records: stores jobs
- Email ingestion → Job records: stores jobs
- Webhook ingestion → Job records: stores jobs
- Scheduled pipeline → LLM tiers: scores titles
- Scheduled pipeline → JD retrieval: retrieves descriptions
- JD retrieval → Resume tailoring: provides descriptions
- Scheduled pipeline → Resume tailoring: prepares resumes
- Resume tailoring → LLM tiers: requests tailoring
- Resume tailoring → CV360 review: checks resume
- CV360 review → Devant CV360: checks document
- Scheduled pipeline → Cover letters: generates letter
- Scheduled pipeline → DOCX generation: generates document
- Scheduled pipeline → Application packet: writes packet
- Scheduled pipeline → Application tracking: records ready status
- Application tracking → Job records: updates records
- Scheduled pipeline → Notifications: sends review notice
- Scheduled pipeline → CSV export: exports records
- Application packet → Human reviewer: presents for review
- Human reviewer → Fill approval: authorizes one fill
- Fill approval → Form-fill worker: starts approved run
- Form-fill worker → Browser manager: opens browser
- Form-fill worker → Field resolution: resolves fields
- Form-fill worker → Employer forms: navigates and fills
- Field resolution → LLM tiers: requests field answers
- LLM tiers → LLM providers: calls configured backend
