Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
093e39b
fixed 1 big chuk issue by changing methodology -- now chunks are buil…
gguillermomendoza Jul 16, 2026
ce5fade
created readme, repo hygiene, added front-end web app, and updated re…
gguillermomendoza Jul 24, 2026
f000585
Replace Streamlit UI with Gradio
gguillermomendoza Jul 25, 2026
bba63b8
Delete .README.md.swp
gguillermomendoza Jul 25, 2026
7f71fc7
added writing sample resolution function
gguillermomendoza Jul 25, 2026
f56c7d0
Merge branch 'main' of https://github.com/gguillermomendoza/ai_resume…
gguillermomendoza Jul 25, 2026
7875143
Add writing style profile extraction
gguillermomendoza Jul 25, 2026
8c41b40
Add grounded cover letter generation
gguillermomendoza Jul 25, 2026
333940b
Added fact-checking function with secure prompt construction and supp…
gguillermomendoza Jul 25, 2026
bb952ac
Add cover letter pipeline orchestrator
gguillermomendoza Jul 25, 2026
8bf2c65
Merge pull request #1 from gguillermomendoza/codex/add-cover-letter-p…
gguillermomendoza Jul 25, 2026
7722acd
Add cover letter workflow to Gradio app
gguillermomendoza Jul 25, 2026
b2c27eb
Merge pull request #2 from gguillermomendoza/codex/add-cover-letter-t…
gguillermomendoza Jul 25, 2026
e05441d
Add github CI workflow, patched test_gradio_app.py
gguillermomendoza Jul 25, 2026
56e70f4
Strengthen cover letter coverage assertions
gguillermomendoza Jul 25, 2026
ad8047f
Merge pull request #3 from gguillermomendoza/codex/add-tests-for-cove…
gguillermomendoza Jul 25, 2026
8918e2b
docs: document resume and cover letter workflows
gguillermomendoza Jul 25, 2026
6ff0e51
Merge pull request #4 from gguillermomendoza/codex/update-readme.md-a…
gguillermomendoza Jul 25, 2026
0458d41
Fix cover letter pipeline isolation defects
gguillermomendoza Jul 25, 2026
009a342
Merge pull request #5 from gguillermomendoza/codex/review-and-fix-def…
gguillermomendoza Jul 25, 2026
c5cea05
Correct badges
gguillermomendoza Jul 26, 2026
1821fb6
Unify resume and cover letter inputs
gguillermomendoza Jul 26, 2026
c1b393c
Merge pull request #6 from gguillermomendoza/codex/add-workflow-selec…
gguillermomendoza Jul 26, 2026
edb5a4f
Remove unncessary UI element
gguillermomendoza Jul 26, 2026
bf9e545
Remove unnecessary shared input renames
gguillermomendoza Jul 26, 2026
695b0ba
Merge branch 'main' into codex/deduplicate-shared-inputs-in-gradio_ap…
gguillermomendoza Jul 26, 2026
2f2a41b
Merge pull request #7 from gguillermomendoza/codex/deduplicate-shared…
gguillermomendoza Jul 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
GOOGLE_API_KEY=replace_with_your_gemini_api_key
18 changes: 18 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: Tests

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
pytest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- run: pip install -r requirements.txt pytest
- run: python -m pytest tests/ -q
18 changes: 18 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Secrets
.env
.streamlit/secrets.toml

# Python
__pycache__/
*.pyc
.pytest_cache/
venv/
.venv/

# Editor swap files
*.swp

# App-generated / local scratch inputs
tailored_resume.md
job_description.txt
resume_example.md
1,092 changes: 593 additions & 499 deletions AI_Resume_Builder_v2_Phase2.ipynb

Large diffs are not rendered by default.

126 changes: 126 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
# AI Resume Builder

[![Tests](https://github.com/gguillermomendoza/ai_resume_builder/actions/workflows/tests.yml/badge.svg)](https://github.com/gguillermomendoza/ai_resume_builder/actions/workflows/tests.yml)

AI Resume Builder is a Gradio application that tailors a résumé to a job description and generates a matching cover letter, grounding candidate claims in evidence from the supplied résumé and optional public GitHub repository metadata while using a separate writing sample to guide the letter's style.

## Features

- Extracts the role's requirements from a pasted or fetched job description.
- Produces grounded résumé tailoring from résumé and optional GitHub evidence.
- Analyzes a writing sample for tone, formality, sentence style, and structure.
- Generates a grounded cover letter from candidate evidence.
- Reports which extracted requirements have supporting evidence and identifies coverage gaps.
- Checks tailored résumés and cover letters for claims that are not supported by the supplied sources.

See `pipeline.py` for the pipeline logic and `gradio_app.py` for the UI. The
`AI_Resume_Builder_v1.ipynb` / `AI_Resume_Builder_v2_Phase2.ipynb` notebooks
are the original, exploratory versions of this pipeline.

## Prerequisites

- Python 3.10+
- A Gemini API key from [Google AI Studio](https://aistudio.google.com/apikey)

## Setup

The project uses `pip` and the dependencies listed in `requirements.txt`.

### macOS and Linux

```bash
git clone https://github.com/gguillermomendoza/ai_resume_builder.git
cd ai_resume_builder
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
cp .env.example .env
```

Open `.env` and replace the placeholder with your Gemini API key. At startup,
`gradio_app.py` calls python-dotenv's `load_dotenv()` to load `.env`, then reads
the key with `os.environ.get("GOOGLE_API_KEY")`.

```bash
python gradio_app.py
```

### Windows PowerShell

```powershell
git clone https://github.com/gguillermomendoza/ai_resume_builder.git
cd ai_resume_builder
py -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
Copy-Item .env.example .env
```

Open `.env` and replace the placeholder with your Gemini API key, then run:

```powershell
python gradio_app.py
```

The app is served locally by Gradio (normally at `http://localhost:7860`). If no
key was loaded from `.env`, the Configuration panel also accepts a key for the
current app process.

## Using the app

### Résumé tailoring

1. Open the **Resume Tailor** tab.
2. Paste a job description or provide its URL.
3. Paste or upload a résumé (`.pdf`, `.md`, or `.txt`).
4. Optionally enter a GitHub username to add public repository evidence and adjust the evidence count.
5. Click **Tailor my resume**, then review the tailored résumé, coverage, fabrication check, evidence, and diff tabs before downloading the Markdown output.

### Cover letter

1. Open the **Cover Letter** tab.
2. Paste a job description or provide its URL.
3. Paste or upload a résumé and a writing sample (`.pdf`, `.md`, or `.txt`).
4. Optionally enter a GitHub username, explicitly describe your motivation for the company or role, and choose the letter length.
5. Click **Generate cover letter**, then review the letter, coverage summary, style profile, retrieved evidence, and fact-check report before downloading the Markdown output.

The **Concise** option targets 250–350 words in 3–4 paragraphs. The **Standard**
option targets 450–600 words in 4–5 paragraphs.

## Cover Letter

The cover-letter workflow assigns a distinct role to each input:

- **Job description (JD):** defines what matters for the role and is used to extract requirements; it is not evidence that the candidate meets them.
- **Résumé and optional GitHub data:** provide the factual evidence used to support candidate claims.
- **Writing sample:** provides style guidance—such as tone, formality, and structure—only.

> **Warning:** The writing sample is not treated as factual evidence. Names, employers, achievements, dates, motivations, and other facts appearing only in that sample must not be used as claims about the candidate.

## Privacy

Job-description text, résumé text, writing-sample text, user-supplied motivation,
and fetched public GitHub repository metadata (repository names, descriptions,
and languages) leave your machine and are sent to the configured Gemini API as
part of model prompts. A job-posting URL is fetched from its remote website, and
a supplied GitHub username is sent to the public GitHub API to fetch repository
metadata. This application does not provide fully local or fully private
processing; review the relevant providers' data policies before submitting
sensitive content.

## Limitations

- Generated cover letters require user review and editing before use.
- Company- or role-specific motivation should be supplied explicitly by the user; the system should not invent it.
- Fact and fabrication checks can compare claims only with content that was uploaded, pasted, or fetched; they cannot independently verify those source facts.
- Scanned PDFs without selectable text are not supported. Convert them with OCR or provide `.md`/`.txt` content first.

## Running the tests

```bash
python -m pytest tests/ -q
```

Tests cover the pipeline and Gradio integration. They do not require a Gemini
API key; PDF-related tests may be skipped when their optional test dependency is
not installed.
Loading