# hemanth-kumar-n-arya/naukri-job-apply-ai architecture

> Architecture diagram of the GitHub repository hemanth-kumar-n-arya/naukri-job-apply-ai, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/hemanth-kumar-n-arya/naukri-job-apply-ai
- Repository: https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai

## Overview

Naukri Auto-Apply automates job discovery, screening, and applications using a manually authenticated browser session and facts from the applicant’s profile. Its primary workflow searches and filters Naukri listings, applies to eligible jobs, handles screening questions, verifies outcomes, and logs results; a separate LinkedIn path supports Easy Apply. Login capture and resume refresh are distinct utilities. The README also describes a mobile dashboard and scheduler, but neither appears in the supplied file tree, so they are omitted. Main-script excerpts are partial; uncertain internal wiring is not shown.

Main entry points: [`linkedin_apply.py`](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/linkedin_apply.py) (LinkedIn Easy Apply), [`common/profile.py`](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/profile.py) (Profile loader), [`naukri_apply.py`](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/naukri_apply.py) (Screening chat), [`naukri_refresh_resume.py`](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/naukri_refresh_resume.py) (Resume refresh)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_application["Job applications"]
  node_naukri_search["Naukri search<br/>[naukri_apply.py]"]
  node_job_filter["Job filtering<br/>[naukri_apply.py]"]
  node_naukri_apply["Naukri application<br/>[naukri_apply.py]"]
  node_screening["Screening chat<br/>[naukri_apply.py]"]
  node_outcome_log["Application log"]
  node_linkedin_apply["LinkedIn Easy Apply<br/>[linkedin_apply.py]"]
end

subgraph group_profile_answers["Applicant data and answers"]
  node_profile["Profile loader<br/>[profile.py]"]
  node_learned_answers["Learned answers<br/>[learned_answers.py]"]
  node_human_input["Human prompts<br/>[human_input.py]"]
  node_llm_dispatch["LLM fallback<br/>[llm.py]"]
end

subgraph group_sessions["Session and resume"]
  node_resume_refresh["Resume refresh"]
  node_login_capture["Login capture<br/>[login_capture.py]"]
  node_session_naukri["Naukri session"]
  node_session_linkedin["LinkedIn session"]
  node_resume_file["Resume file"]
end

subgraph group_integrations["External services"]
  node_gemini["Gemini client<br/>[gemini.py]"]
  node_groq["Groq client<br/>[groq_llm.py]"]
  node_naukri_site["Naukri"]
  node_linkedin_site["LinkedIn"]
end

node_user(("Applicant"))

node_user -->|"logs in manually"| node_login_capture
node_login_capture -->|"saves session"| node_session_naukri
node_login_capture -->|"saves session"| node_session_linkedin
node_user -->|"starts run"| node_naukri_search
node_user -->|"starts run"| node_linkedin_apply
node_profile -->|"provides roles"| node_naukri_search
node_profile -->|"provides criteria"| node_job_filter
node_naukri_search -->|"searches listings"| node_naukri_site
node_naukri_search -->|"checks listings"| node_job_filter
node_naukri_apply -->|"applies"| node_naukri_site
node_naukri_apply -->|"handles questions"| node_screening
node_screening -->|"requests draft"| node_llm_dispatch
node_llm_dispatch -->|"tries first"| node_gemini
node_llm_dispatch -.->|"quota fallback"| node_groq
node_screening -->|"requests missing facts"| node_human_input
node_screening -.->|"answer reuse"| node_learned_answers
node_profile -->|"provides answers"| node_linkedin_apply
node_linkedin_apply -->|"drafts answers"| node_gemini
node_linkedin_apply -->|"searches and applies"| node_linkedin_site
node_naukri_apply -->|"logs outcomes"| node_outcome_log
node_linkedin_apply -->|"logs outcomes"| node_outcome_log
node_session_naukri -->|"restores session"| node_naukri_apply
node_session_linkedin -->|"restores session"| node_linkedin_apply
node_session_naukri -->|"restores session"| node_resume_refresh
node_profile -->|"provides filename"| node_resume_refresh
node_resume_refresh -->|"uploads resume"| node_resume_file
node_resume_refresh -->|"updates profile"| node_naukri_site

click node_naukri_search "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/naukri_apply.py"
click node_job_filter "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/naukri_apply.py"
click node_naukri_apply "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/naukri_apply.py"
click node_screening "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/naukri_apply.py"
click node_outcome_log "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/applications_log.csv"
click node_linkedin_apply "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/linkedin_apply.py"
click node_resume_refresh "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/naukri_refresh_resume.py"
click node_profile "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/profile.py"
click node_learned_answers "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/learned_answers.py"
click node_human_input "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/human_input.py"
click node_llm_dispatch "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/llm.py"
click node_gemini "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/gemini.py"
click node_groq "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/groq_llm.py"
click node_login_capture "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/login_capture.py"
click node_session_naukri "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/session_naukri.json"
click node_session_linkedin "https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/session_linkedin.json"

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_naukri_search,node_job_filter,node_naukri_apply,node_screening,node_outcome_log,node_linkedin_apply toneBlue
class node_profile,node_learned_answers,node_human_input,node_llm_dispatch toneAmber
class node_resume_refresh,node_login_capture,node_session_naukri,node_session_linkedin,node_resume_file toneMint
class node_gemini,node_groq,node_naukri_site,node_linkedin_site toneRose
class node_user toneIndigo
```

## Components

### Job applications

- [Naukri search](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/naukri_apply.py): `naukri_apply.py`
- [Job filtering](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/naukri_apply.py): `naukri_apply.py`
- [Naukri application](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/naukri_apply.py): `naukri_apply.py`
- [Screening chat](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/naukri_apply.py): `naukri_apply.py`
- [Application log](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/applications_log.csv): `applications_log.csv`
- [LinkedIn Easy Apply](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/linkedin_apply.py): `linkedin_apply.py`

### Applicant data and answers

- [Profile loader](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/profile.py): `common/profile.py`
- [Learned answers](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/learned_answers.py): `common/learned_answers.py`
- [Human prompts](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/human_input.py): `common/human_input.py`
- [LLM fallback](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/llm.py): `common/llm.py`

### Session and resume

- [Resume refresh](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/naukri_refresh_resume.py): `naukri_refresh_resume.py`
- [Login capture](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/login_capture.py): `login_capture.py`
- [Naukri session](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/session_naukri.json): `session_naukri.json`
- [LinkedIn session](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/session_linkedin.json): `session_linkedin.json`
- **Resume file**

### External services

- [Gemini client](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/gemini.py): `common/gemini.py`
- [Groq client](https://github.com/hemanth-kumar-n-arya/naukri-job-apply-ai/blob/main/common/groq_llm.py): `common/groq_llm.py`
- **Naukri**
- **LinkedIn**

### Other components

- **Applicant**

## Connections

- Applicant → Login capture: logs in manually
- Login capture → Naukri session: saves session
- Login capture → LinkedIn session: saves session
- Applicant → Naukri search: starts run
- Applicant → LinkedIn Easy Apply: starts run
- Profile loader → Naukri search: provides roles
- Profile loader → Job filtering: provides criteria
- Naukri search → Naukri: searches listings
- Naukri search → Job filtering: checks listings
- Naukri application → Naukri: applies
- Naukri application → Screening chat: handles questions
- Screening chat → LLM fallback: requests draft
- LLM fallback → Gemini client: tries first
- LLM fallback → Groq client: quota fallback
- Screening chat → Human prompts: requests missing facts
- Screening chat → Learned answers: answer reuse
- Profile loader → LinkedIn Easy Apply: provides answers
- LinkedIn Easy Apply → Gemini client: drafts answers
- LinkedIn Easy Apply → LinkedIn: searches and applies
- Naukri application → Application log: logs outcomes
- LinkedIn Easy Apply → Application log: logs outcomes
- Naukri session → Naukri application: restores session
- LinkedIn session → LinkedIn Easy Apply: restores session
- Naukri session → Resume refresh: restores session
- Profile loader → Resume refresh: provides filename
- Resume refresh → Resume file: uploads resume
- Resume refresh → Naukri: updates profile
