Skip to content

ShuckleCodes/JobApplicationHelper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Job Application Helper

A Streamlit web application that automates resume and cover letter tailoring for job applications, and tracks application status. Uses Anthropic Claude as the primary LLM, with a SQLite database for storage.

Quick Start

1. Install dependencies

pip install -r requirements.txt

2. Configure your API key

Copy .env.example to .env and add your Anthropic API key:

ANTHROPIC_API_KEY=your-key-here

Or set it in the app via the Settings page.

3. Add your Word templates

Place your .docx template files in the templates/ folder:

  • Resume templates: any .docx file (e.g., resume_template.docx)
  • Cover letter templates: filename must contain cover or letter (e.g., cover_letter_template.docx)

See Template Placeholders below for the full list of available placeholders.

4. Run the app

streamlit run app.py

Opens at http://localhost:8501.

Pages

Page Description
Dashboard View all applications, filter by status, update status, add notes
New Application Paste a job description, generate a tailored resume and cover letter, edit inline, export to DOCX
Profile Editor Create and manage candidate profiles (experience, skills, education, achievement bank)
Settings API keys, model selection, prompt template editor with versioning

Workflow

  1. Create a profile in the Profile Editor (experience, skills, achievements, contact info)
  2. Paste a job description on the New Application page and select your profile
  3. Generate - the app parses the JD, matches your experience, and calls the LLM to produce a tailored resume and cover letter
  4. Review and edit the generated content inline
  5. Export to DOCX using your Word templates
  6. Track the application status on the Dashboard

Template Placeholders

Templates use docxtpl (Jinja2-style templating for Word). Place these placeholders directly in your .docx files.

Profile / Contact (available in both resume and cover letter templates)

Placeholder Content
{{NAME}} Full name from profile
{{EMAIL}} Email address
{{PHONE}} Phone number
{{LOCATION}} Location / city
{{LINKEDIN}} LinkedIn URL
{{GITHUB}} GitHub URL
{{WEBSITE}} Website URL

Resume Placeholders

Placeholder Content
{{HEADLINE}} LLM-tailored headline
{{SUMMARY}} LLM-tailored summary (3-5 sentences)
{{LEADERSHIP_SKILLS}} Comma-separated leadership skills
{{TECHNICAL_SKILLS}} Comma-separated technical skills
{{DELIVERY_SKILLS}} Comma-separated delivery skills
{{OTHER_SKILLS}} Comma-separated other skills
{{EXPERIENCE_SECTION}} Pre-formatted experience as a plain text block
{{CERTIFICATIONS_SECTION}} Pre-formatted certifications
{{EDUCATION_SECTION}} Pre-formatted education
{{PROJECTS_SECTION}} Pre-formatted projects

Experience Loop (for full control over formatting)

{%for exp in experience%}
{{exp.role}} | {{exp.company}} | {{exp.dates}} | {{exp.location}}
{%for bullet in exp.bullets%}
- {{bullet}}
{%endfor%}
{{exp.tech_focus}}
{%endfor%}

Additional Sections Loop

{%for item in certifications%}{{item}}{%endfor%}
{%for item in education%}{{item}}{%endfor%}
{%for item in projects%}{{item}}{%endfor%}

Cover Letter Placeholders

Placeholder Content
{{COMPANY}} Target company name
{{ROLE}} Target role title
{{OPENING}} Opening paragraph
{{BODY}} All body paragraphs joined together
{{CLOSING}} Closing paragraph

Body Paragraphs Loop

{%for para in body_paragraphs%}
{{para}}
{%endfor%}

Project Structure

JobApplicationHelper/
├── app.py                          # Streamlit entry point
├── pages/
│   ├── 1_Dashboard.py              # Application tracker dashboard
│   ├── 2_New_Application.py        # Job intake + generation workflow
│   ├── 3_Profile_Editor.py         # Manage candidate profiles
│   └── 4_Settings.py               # API keys, prompt templates, preferences
├── core/
│   ├── database.py                 # SQLite setup and CRUD operations
│   ├── models.py                   # Pydantic schemas
│   ├── job_parser.py               # Job description parsing and keyword extraction
│   ├── matcher.py                  # Score and select relevant experience/bullets
│   ├── llm_client.py               # LLM provider abstraction (Anthropic, OpenAI)
│   ├── prompt_manager.py           # Prompt template loading and rendering
│   ├── generator.py                # Generation pipeline orchestrator
│   └── docx_renderer.py            # Word template rendering
├── prompts/                        # Default prompt template files
├── templates/                      # Your .docx templates go here
├── data/                           # SQLite database (created at runtime)
├── requirements.txt
└── .env                            # API keys (not committed)

Tech Stack

  • Python 3.12+
  • Streamlit 1.54
  • Pydantic v2
  • Anthropic SDK (Claude)
  • docxtpl (Word template rendering)
  • pymupdf (PDF text extraction)
  • pywin32 (Word COM automation for PDF export)
  • SQLite (local database)

Application Tracking Stages

SavedAppliedPhone ScreenInterviewOffer / Rejected / Withdrawn

Prompt Templates

The app ships with default prompt templates for:

  • Resume generation - Tailors resume and cover letter to a job description
  • Fact-check - Second-pass validation to catch hallucinations
  • Keyword audit - ATS keyword coverage analysis

Templates are versioned and editable via the Settings page. Each template has a system prompt and a user prompt with {{variable}} placeholders that are filled at runtime.

Security

  • API keys are stored locally in .env and never logged
  • Profile data is stored locally in SQLite
  • No resume content is sent to cloud services other than the configured LLM provider
  • .env and database files are in .gitignore

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages