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.
pip install -r requirements.txtCopy .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.
Place your .docx template files in the templates/ folder:
- Resume templates: any
.docxfile (e.g.,resume_template.docx) - Cover letter templates: filename must contain
coverorletter(e.g.,cover_letter_template.docx)
See Template Placeholders below for the full list of available placeholders.
streamlit run app.pyOpens at http://localhost:8501.
| 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 |
- Create a profile in the Profile Editor (experience, skills, achievements, contact info)
- Paste a job description on the New Application page and select your profile
- Generate - the app parses the JD, matches your experience, and calls the LLM to produce a tailored resume and cover letter
- Review and edit the generated content inline
- Export to DOCX using your Word templates
- Track the application status on the Dashboard
Templates use docxtpl (Jinja2-style templating for Word). Place these placeholders directly in your .docx files.
| 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 |
| 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 |
{%for exp in experience%}
{{exp.role}} | {{exp.company}} | {{exp.dates}} | {{exp.location}}
{%for bullet in exp.bullets%}
- {{bullet}}
{%endfor%}
{{exp.tech_focus}}
{%endfor%}
{%for item in certifications%}{{item}}{%endfor%}
{%for item in education%}{{item}}{%endfor%}
{%for item in projects%}{{item}}{%endfor%}
| Placeholder | Content |
|---|---|
{{COMPANY}} |
Target company name |
{{ROLE}} |
Target role title |
{{OPENING}} |
Opening paragraph |
{{BODY}} |
All body paragraphs joined together |
{{CLOSING}} |
Closing paragraph |
{%for para in body_paragraphs%}
{{para}}
{%endfor%}
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)
- 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)
Saved → Applied → Phone Screen → Interview → Offer / Rejected / Withdrawn
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.
- API keys are stored locally in
.envand never logged - Profile data is stored locally in SQLite
- No resume content is sent to cloud services other than the configured LLM provider
.envand database files are in.gitignore