You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
erDiagram
JOB ||--o| RESUME : "has tailored"
JOB ||--o{ APPLICATION_LOG : "has"
JOB {
int id PK
string external_id
string title
string company
string location
string salary_range
text description_text
string url UK
string source
float match_score
string status
datetime discovered_at
datetime applied_at
string resume_path
text notes
}
RESUME {
int id PK
string name
int target_job_id FK
json content_snapshot
string file_path
float ats_score
datetime created_at
}
APPLICATION_LOG {
int id PK
int job_id FK
string portal
string status
text error_message
string screenshot_path
json questions_answered
float duration_seconds
datetime timestamp
}
SEARCH_RUN {
int id PK
string portal
string search_query
int jobs_found
int jobs_new
datetime started_at
datetime completed_at
}
classProfileManager:
defload(self) ->CandidateProfile:
"""Load profile from YAML file."""defsave(self, profile: CandidateProfile):
"""Save profile to YAML file."""defupdate_section(self, section: str, data: dict):
"""Update a specific section (skills, experience, etc.)."""defimport_from_resume(self, file_path: str) ->CandidateProfile:
"""Parse PDF/DOCX and create initial profile draft."""classResumeImporter:
defparse_pdf(self, path: str) ->str:
"""Extract raw text from PDF using pdfminer."""defparse_docx(self, path: str) ->str:
"""Extract text from DOCX using python-docx."""defextract_entities(self, text: str) ->dict:
"""Use spaCy NER to extract structured data."""
4.2 Analyzer Module
classATSScorer:
defscore(self, resume_text: str, jd_text: str) ->ScoreResult:
"""Calculate ATS compatibility score (0-100)."""classKeywordExtractor:
defextract(self, text: str) ->list[Keyword]:
"""Extract keywords using spaCy noun chunks + NER."""defextract_with_importance(self, jd_text: str) ->list[ScoredKeyword]:
"""Extract keywords with importance weight based on frequency and position."""classSuggestionEngine:
defsuggest(self, score_result: ScoreResult, profile: CandidateProfile) ->list[Suggestion]:
"""Generate actionable suggestions to improve ATS score."""
4.3 Discovery Module
classDiscoveryManager:
def__init__(self, drivers: dict[str, BasePortalDriver]):
self.drivers=driversasyncdefrun_search(self, config: SearchConfig) ->list[Job]:
"""Execute search across all configured portals."""asyncdefscore_jobs(self, jobs: list[Job], profile: CandidateProfile):
"""Score each job against the candidate profile."""classDeduplicator:
defdeduplicate(self, new_jobs: list[Job], existing_jobs: list[Job]) ->list[Job]:
"""Return only truly new jobs."""
4.4 Generator Module
classContentSelector:
defselect(self, profile: CandidateProfile, jd_analysis: JDAnalysis) ->ResumeContent:
"""Pick the most relevant skills, bullets, projects for this JD."""classLLMRewriter:
defrewrite_summary(self, profile: CandidateProfile, jd: JDAnalysis) ->str:
"""Generate a tailored professional summary."""defenhance_bullet(self, bullet: str, keywords: list[str], profile: CandidateProfile) ->str:
"""Optionally rephrase a bullet to include missing keywords."""classResumeRenderer:
defrender_html(self, content: ResumeContent, template: str) ->str:
"""Render Jinja2 template with selected content."""defrender_pdf(self, html: str, output_path: str):
"""Convert HTML to PDF using WeasyPrint."""