flash-resume 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flash_resume-0.2.0/.github/workflows/publish.yml +33 -0
- flash_resume-0.2.0/.gitignore +16 -0
- flash_resume-0.2.0/.python-version +1 -0
- flash_resume-0.2.0/PKG-INFO +208 -0
- flash_resume-0.2.0/README.md +191 -0
- flash_resume-0.2.0/examples/job_description.txt +20 -0
- flash_resume-0.2.0/examples/master_resume.json +97 -0
- flash_resume-0.2.0/extension/content.js +53 -0
- flash_resume-0.2.0/extension/manifest.json +29 -0
- flash_resume-0.2.0/extension/onboarding.html +511 -0
- flash_resume-0.2.0/extension/onboarding.js +260 -0
- flash_resume-0.2.0/extension/popup.html +439 -0
- flash_resume-0.2.0/extension/popup.js +241 -0
- flash_resume-0.2.0/main.py +6 -0
- flash_resume-0.2.0/pyproject.toml +41 -0
- flash_resume-0.2.0/src/flash_resume/__init__.py +17 -0
- flash_resume-0.2.0/src/flash_resume/autostart.py +112 -0
- flash_resume-0.2.0/src/flash_resume/bootstrap.py +29 -0
- flash_resume-0.2.0/src/flash_resume/cli.py +597 -0
- flash_resume-0.2.0/src/flash_resume/config.py +94 -0
- flash_resume-0.2.0/src/flash_resume/extension.py +66 -0
- flash_resume-0.2.0/src/flash_resume/models/__init__.py +32 -0
- flash_resume-0.2.0/src/flash_resume/models/job.py +20 -0
- flash_resume-0.2.0/src/flash_resume/models/resume.py +85 -0
- flash_resume-0.2.0/src/flash_resume/models/tailoring.py +58 -0
- flash_resume-0.2.0/src/flash_resume/services/compiler.py +128 -0
- flash_resume-0.2.0/src/flash_resume/services/groq_llm.py +130 -0
- flash_resume-0.2.0/src/flash_resume/services/llm.py +171 -0
- flash_resume-0.2.0/src/flash_resume/services/parser.py +61 -0
- flash_resume-0.2.0/src/flash_resume/services/server.py +179 -0
- flash_resume-0.2.0/src/flash_resume/services/tailor.py +302 -0
- flash_resume-0.2.0/src/flash_resume/services/validator.py +54 -0
- flash_resume-0.2.0/src/flash_resume/utils/diff.py +83 -0
- flash_resume-0.2.0/templates/resume.typ +271 -0
- flash_resume-0.2.0/tests/test_compiler.py +30 -0
- flash_resume-0.2.0/tests/test_models.py +46 -0
- flash_resume-0.2.0/tests/test_tailor.py +187 -0
- flash_resume-0.2.0/uv.lock +1697 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
# Publishes to PyPI via a trusted publisher (no stored API token).
|
|
4
|
+
# Triggered when a matching version tag is pushed, e.g. `git tag v0.2.0`.
|
|
5
|
+
on:
|
|
6
|
+
push:
|
|
7
|
+
tags:
|
|
8
|
+
- "v*"
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
publish:
|
|
12
|
+
name: Build and publish
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
permissions:
|
|
15
|
+
# Required for trusted publishing against PyPI (OIDC).
|
|
16
|
+
id-token: write
|
|
17
|
+
steps:
|
|
18
|
+
- name: Checkout
|
|
19
|
+
uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Set up Python
|
|
22
|
+
uses: actions/setup-python@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.12"
|
|
25
|
+
|
|
26
|
+
- name: Install build backend
|
|
27
|
+
run: python -m pip install --upgrade build
|
|
28
|
+
|
|
29
|
+
- name: Build sdist + wheel
|
|
30
|
+
run: python -m build
|
|
31
|
+
|
|
32
|
+
- name: Publish to PyPI
|
|
33
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: flash-resume
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Fast, ATS-focused resume tailoring and PDF generation.
|
|
5
|
+
Requires-Python: >=3.12
|
|
6
|
+
Requires-Dist: fastapi[standard]>=0.141.1
|
|
7
|
+
Requires-Dist: google-genai>=1.0.0
|
|
8
|
+
Requires-Dist: openai>=1.0.0
|
|
9
|
+
Requires-Dist: pydantic>=2.12.0
|
|
10
|
+
Requires-Dist: pypdf>=6.0.0
|
|
11
|
+
Requires-Dist: pyperclip>=1.9.0
|
|
12
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
13
|
+
Requires-Dist: rich>=14.0.0
|
|
14
|
+
Requires-Dist: typer>=0.15.0
|
|
15
|
+
Requires-Dist: typst>=0.15.0
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
|
|
18
|
+
# ⚡ Flash Resume
|
|
19
|
+
|
|
20
|
+
> **Fast, ATS-targeted resume tailoring and layout-verified 1-page PDF generation.**
|
|
21
|
+
|
|
22
|
+
Stop the manual **3-tab shuffle** (Job Board ↔ ChatGPT ↔ Overleaf). Full document AI rewrites take 15+ seconds, hallucinate experience, and push single-page resumes onto page 2.
|
|
23
|
+
|
|
24
|
+
**Flash Resume** solves this by:
|
|
25
|
+
1. **Targeted ATS Diffing**: Injects high-density keywords from the job description directly into existing skills and bullets with a **strict word-count budget ($\pm 2$ words)**.
|
|
26
|
+
2. **Instant Typst Compilation**: Compiles your resume locally in **< 100 milliseconds** via bundled Typst.
|
|
27
|
+
3. **Programmatic Overflow Protection**: Uses `pypdf` to inspect the compiled document and guarantee a **verified single-page fit**.
|
|
28
|
+
4. **Choice of AI engine**: Pick **Gemini** for best ATS keyword quality (~15-20s) or **Groq** for near-instant tailoring (**~3s**) — switch any time from the extension setup.
|
|
29
|
+
5. **1-Click Browser Extension**: Tailor from LinkedIn, Indeed, or Greenhouse — the verified PDF is saved straight to your chosen folder, no download prompt.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 🚀 Quick Start (Windows)
|
|
34
|
+
|
|
35
|
+
### 1. Install
|
|
36
|
+
|
|
37
|
+
```powershell
|
|
38
|
+
pip install flash-resume
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
That's it for dependencies — the package bundles everything (Typst engine, AI clients, the extension files).
|
|
42
|
+
|
|
43
|
+
### 2. One-Time Setup
|
|
44
|
+
|
|
45
|
+
```powershell
|
|
46
|
+
fs setup
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
This interactive command:
|
|
50
|
+
1. Asks you to pick an AI provider (**Gemini** quality or **Groq** speed) and enter your free API key
|
|
51
|
+
2. Sets up your master resume (runs the init wizard if needed)
|
|
52
|
+
3. Registers the engine to **start silently at Windows logon** — no terminal ever needed again
|
|
53
|
+
4. Copies the Chrome extension to a stable folder and tells you where to Load-unpack it
|
|
54
|
+
|
|
55
|
+
### 3. Load the Extension (Once)
|
|
56
|
+
|
|
57
|
+
1. Open `chrome://extensions/` (works in Chrome, Brave, and Edge)
|
|
58
|
+
2. Enable **Developer mode** (top-right toggle)
|
|
59
|
+
3. Click **Load unpacked** and select the folder printed by `fs setup`
|
|
60
|
+
(default: `%LOCALAPPDATA%\flash-resume\extension`)
|
|
61
|
+
|
|
62
|
+
**That's it.** The engine autostarts at login, and the extension reconnects automatically — no reloads, no terminal, no "keep this window open" needed.
|
|
63
|
+
|
|
64
|
+
### Managing the Setup
|
|
65
|
+
|
|
66
|
+
```powershell
|
|
67
|
+
fs autostart status # check if the at-login autostart is registered
|
|
68
|
+
fs autostart disable # stop the engine from starting at login
|
|
69
|
+
fs autostart enable # re-enable it
|
|
70
|
+
fs extension-path # print the extension folder for Load-unpacked
|
|
71
|
+
fs doctor # verify system health
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### For Contributors (from source)
|
|
75
|
+
|
|
76
|
+
```powershell
|
|
77
|
+
git clone https://github.com/PavanBollepalli/flash-resume.git
|
|
78
|
+
cd flash-resume
|
|
79
|
+
uv sync
|
|
80
|
+
uv run fs init
|
|
81
|
+
uv run fs doctor
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## ⚡ Daily Usage
|
|
87
|
+
|
|
88
|
+
### The Everyday Command: `fs tailor`
|
|
89
|
+
|
|
90
|
+
When browsing jobs on LinkedIn, Naukri, or Indeed:
|
|
91
|
+
|
|
92
|
+
1. **Copy the job description** to your clipboard (`Ctrl + C`).
|
|
93
|
+
2. Run:
|
|
94
|
+
|
|
95
|
+
```powershell
|
|
96
|
+
uv run fs tailor
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
You can also make clipboard input explicit with `uv run fs tailor --clip`.
|
|
100
|
+
|
|
101
|
+
*That's it!* Flash Resume:
|
|
102
|
+
- Automatically reads the JD from your system clipboard
|
|
103
|
+
- Infers target **Company** and **Role**
|
|
104
|
+
- Integrates high-impact ATS keywords into relevant bullets and skills
|
|
105
|
+
- Compiles the PDF and verifies the 1-page layout
|
|
106
|
+
- Saves:
|
|
107
|
+
- `Company_Role.pdf` (Ready to upload)
|
|
108
|
+
- `Company_Role.json` (Structured tailored resume)
|
|
109
|
+
- `Company_Role.diff.md` (Reviewable before/after report)
|
|
110
|
+
- Renders a Rich visual terminal diff:
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
✓ Flash Resume Tailoring Complete
|
|
114
|
+
Datadog — Backend Software Engineer
|
|
115
|
+
ATS Match Score: 94% | Pages: 1 page (Layout Verified) | Compile: 72.5ms | Total: 1.84s
|
|
116
|
+
|
|
117
|
+
Integrated ATS Keywords: FastAPI PostgreSQL Docker Redis
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Custom Overrides (Optional)
|
|
121
|
+
|
|
122
|
+
```powershell
|
|
123
|
+
# Pass a job description file or string directly
|
|
124
|
+
uv run fs tailor --jd ./jobs/datadog_swe.txt
|
|
125
|
+
|
|
126
|
+
# Paste a long job description safely, including quotes and apostrophes
|
|
127
|
+
Get-Content ./jobs/joveo.txt | uv run fs tailor --jd -
|
|
128
|
+
# Git Bash alternative:
|
|
129
|
+
cat ./jobs/joveo.txt | uv run fs tailor --jd -
|
|
130
|
+
|
|
131
|
+
# Override company or role name
|
|
132
|
+
uv run fs tailor --company "Google" --role "Site Reliability Engineer"
|
|
133
|
+
|
|
134
|
+
# Specify a custom output folder
|
|
135
|
+
uv run fs tailor --out ./applications/2026/
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 🧩 Chrome Extension (1-Click Tailor)
|
|
141
|
+
|
|
142
|
+
After `fs setup`, the companion engine runs silently in the background. The extension just talks to it:
|
|
143
|
+
|
|
144
|
+
1. Open any job posting on **LinkedIn**, **Indeed**, or **Greenhouse**.
|
|
145
|
+
2. Click the **Flash Resume** icon → **"⚡ Tailor 1-Page Resume"**. The company, role, and job description are auto-filled (including from text you've selected on the page). The verified PDF is saved directly to your configured folder and the saved path is shown — no download dialog.
|
|
146
|
+
|
|
147
|
+
The extension's built-in **Setup** wizard (first-run) lets you switch providers, update keys, or change the save folder at any time.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 🏗️ Architecture
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
flash-resume/
|
|
155
|
+
├── pyproject.toml # Package dependencies & scripts
|
|
156
|
+
├── README.md # Project documentation
|
|
157
|
+
├── templates/
|
|
158
|
+
│ └── resume.typ # Modern, ATS-optimized Typst template
|
|
159
|
+
├── extension/ # Manifest V3 Chrome Extension
|
|
160
|
+
│ ├── manifest.json
|
|
161
|
+
│ ├── popup.html / popup.js # Tailor UI + saved-path view (no download prompt)
|
|
162
|
+
│ ├── onboarding.html / onboarding.js # 6-step autosaving setup wizard
|
|
163
|
+
│ └── content.js
|
|
164
|
+
├── src/flash_resume/
|
|
165
|
+
│ ├── cli.py # Typer CLI (setup, init, tailor, serve, autostart, ...)
|
|
166
|
+
│ ├── config.py # ~/.config/flash-resume/config.json
|
|
167
|
+
│ ├── bootstrap.py # Silent server entrypoint (pythonw -m flash_resume.bootstrap)
|
|
168
|
+
│ ├── autostart.py # Windows Run-key registration for at-login server start
|
|
169
|
+
│ ├── extension.py # Bundled Chrome extension installer (Load-unpacked path)
|
|
170
|
+
│ ├── models/
|
|
171
|
+
│ │ ├── resume.py # MasterResume & structured components
|
|
172
|
+
│ │ ├── job.py # JobAnalysis & extracted specs
|
|
173
|
+
│ │ └── tailoring.py # TailorPlan, BulletEdit & TailorResult
|
|
174
|
+
│ ├── services/
|
|
175
|
+
│ │ ├── compiler.py # Typst compilation & pypdf page validation
|
|
176
|
+
│ │ ├── llm.py # Gemini Flash structured ATS optimization
|
|
177
|
+
│ │ ├── groq_llm.py # Groq (gpt-oss-20b) fast provider
|
|
178
|
+
│ │ ├── tailor.py # Pipeline orchestrator & diff generator
|
|
179
|
+
│ │ └── server.py # FastAPI companion daemon for Chrome Extension
|
|
180
|
+
│ └── utils/
|
|
181
|
+
│ └── diff.py # Rich terminal visualization
|
|
182
|
+
├── examples/
|
|
183
|
+
│ ├── master_resume.json # Realistic reference master resume
|
|
184
|
+
│ └── job_description.txt # Sample job description
|
|
185
|
+
└── tests/
|
|
186
|
+
├── test_models.py
|
|
187
|
+
├── test_compiler.py
|
|
188
|
+
└── test_tailor.py
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 🛡️ Product Principles
|
|
194
|
+
|
|
195
|
+
* **100% Factual Truthfulness**: The engine only maps keywords and rephrases bullets that align with existing experience. It never invents companies, degrees, metrics, or domains you haven't touched.
|
|
196
|
+
* **Layout-Preserving Word Budgets**: Replacement bullets are strictly constrained to $\pm 2$ words of the original bullet, preventing multi-line overflow.
|
|
197
|
+
* **Sub-100ms Local Compilation**: Pure local Typst compilation ensures blazing-fast rendering without waiting for external server queues.
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 🧪 Testing
|
|
202
|
+
|
|
203
|
+
Run automated tests:
|
|
204
|
+
|
|
205
|
+
```powershell
|
|
206
|
+
uv run pytest
|
|
207
|
+
```
|
|
208
|
+
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# ⚡ Flash Resume
|
|
2
|
+
|
|
3
|
+
> **Fast, ATS-targeted resume tailoring and layout-verified 1-page PDF generation.**
|
|
4
|
+
|
|
5
|
+
Stop the manual **3-tab shuffle** (Job Board ↔ ChatGPT ↔ Overleaf). Full document AI rewrites take 15+ seconds, hallucinate experience, and push single-page resumes onto page 2.
|
|
6
|
+
|
|
7
|
+
**Flash Resume** solves this by:
|
|
8
|
+
1. **Targeted ATS Diffing**: Injects high-density keywords from the job description directly into existing skills and bullets with a **strict word-count budget ($\pm 2$ words)**.
|
|
9
|
+
2. **Instant Typst Compilation**: Compiles your resume locally in **< 100 milliseconds** via bundled Typst.
|
|
10
|
+
3. **Programmatic Overflow Protection**: Uses `pypdf` to inspect the compiled document and guarantee a **verified single-page fit**.
|
|
11
|
+
4. **Choice of AI engine**: Pick **Gemini** for best ATS keyword quality (~15-20s) or **Groq** for near-instant tailoring (**~3s**) — switch any time from the extension setup.
|
|
12
|
+
5. **1-Click Browser Extension**: Tailor from LinkedIn, Indeed, or Greenhouse — the verified PDF is saved straight to your chosen folder, no download prompt.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 🚀 Quick Start (Windows)
|
|
17
|
+
|
|
18
|
+
### 1. Install
|
|
19
|
+
|
|
20
|
+
```powershell
|
|
21
|
+
pip install flash-resume
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
That's it for dependencies — the package bundles everything (Typst engine, AI clients, the extension files).
|
|
25
|
+
|
|
26
|
+
### 2. One-Time Setup
|
|
27
|
+
|
|
28
|
+
```powershell
|
|
29
|
+
fs setup
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
This interactive command:
|
|
33
|
+
1. Asks you to pick an AI provider (**Gemini** quality or **Groq** speed) and enter your free API key
|
|
34
|
+
2. Sets up your master resume (runs the init wizard if needed)
|
|
35
|
+
3. Registers the engine to **start silently at Windows logon** — no terminal ever needed again
|
|
36
|
+
4. Copies the Chrome extension to a stable folder and tells you where to Load-unpack it
|
|
37
|
+
|
|
38
|
+
### 3. Load the Extension (Once)
|
|
39
|
+
|
|
40
|
+
1. Open `chrome://extensions/` (works in Chrome, Brave, and Edge)
|
|
41
|
+
2. Enable **Developer mode** (top-right toggle)
|
|
42
|
+
3. Click **Load unpacked** and select the folder printed by `fs setup`
|
|
43
|
+
(default: `%LOCALAPPDATA%\flash-resume\extension`)
|
|
44
|
+
|
|
45
|
+
**That's it.** The engine autostarts at login, and the extension reconnects automatically — no reloads, no terminal, no "keep this window open" needed.
|
|
46
|
+
|
|
47
|
+
### Managing the Setup
|
|
48
|
+
|
|
49
|
+
```powershell
|
|
50
|
+
fs autostart status # check if the at-login autostart is registered
|
|
51
|
+
fs autostart disable # stop the engine from starting at login
|
|
52
|
+
fs autostart enable # re-enable it
|
|
53
|
+
fs extension-path # print the extension folder for Load-unpacked
|
|
54
|
+
fs doctor # verify system health
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### For Contributors (from source)
|
|
58
|
+
|
|
59
|
+
```powershell
|
|
60
|
+
git clone https://github.com/PavanBollepalli/flash-resume.git
|
|
61
|
+
cd flash-resume
|
|
62
|
+
uv sync
|
|
63
|
+
uv run fs init
|
|
64
|
+
uv run fs doctor
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## ⚡ Daily Usage
|
|
70
|
+
|
|
71
|
+
### The Everyday Command: `fs tailor`
|
|
72
|
+
|
|
73
|
+
When browsing jobs on LinkedIn, Naukri, or Indeed:
|
|
74
|
+
|
|
75
|
+
1. **Copy the job description** to your clipboard (`Ctrl + C`).
|
|
76
|
+
2. Run:
|
|
77
|
+
|
|
78
|
+
```powershell
|
|
79
|
+
uv run fs tailor
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
You can also make clipboard input explicit with `uv run fs tailor --clip`.
|
|
83
|
+
|
|
84
|
+
*That's it!* Flash Resume:
|
|
85
|
+
- Automatically reads the JD from your system clipboard
|
|
86
|
+
- Infers target **Company** and **Role**
|
|
87
|
+
- Integrates high-impact ATS keywords into relevant bullets and skills
|
|
88
|
+
- Compiles the PDF and verifies the 1-page layout
|
|
89
|
+
- Saves:
|
|
90
|
+
- `Company_Role.pdf` (Ready to upload)
|
|
91
|
+
- `Company_Role.json` (Structured tailored resume)
|
|
92
|
+
- `Company_Role.diff.md` (Reviewable before/after report)
|
|
93
|
+
- Renders a Rich visual terminal diff:
|
|
94
|
+
|
|
95
|
+
```text
|
|
96
|
+
✓ Flash Resume Tailoring Complete
|
|
97
|
+
Datadog — Backend Software Engineer
|
|
98
|
+
ATS Match Score: 94% | Pages: 1 page (Layout Verified) | Compile: 72.5ms | Total: 1.84s
|
|
99
|
+
|
|
100
|
+
Integrated ATS Keywords: FastAPI PostgreSQL Docker Redis
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Custom Overrides (Optional)
|
|
104
|
+
|
|
105
|
+
```powershell
|
|
106
|
+
# Pass a job description file or string directly
|
|
107
|
+
uv run fs tailor --jd ./jobs/datadog_swe.txt
|
|
108
|
+
|
|
109
|
+
# Paste a long job description safely, including quotes and apostrophes
|
|
110
|
+
Get-Content ./jobs/joveo.txt | uv run fs tailor --jd -
|
|
111
|
+
# Git Bash alternative:
|
|
112
|
+
cat ./jobs/joveo.txt | uv run fs tailor --jd -
|
|
113
|
+
|
|
114
|
+
# Override company or role name
|
|
115
|
+
uv run fs tailor --company "Google" --role "Site Reliability Engineer"
|
|
116
|
+
|
|
117
|
+
# Specify a custom output folder
|
|
118
|
+
uv run fs tailor --out ./applications/2026/
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 🧩 Chrome Extension (1-Click Tailor)
|
|
124
|
+
|
|
125
|
+
After `fs setup`, the companion engine runs silently in the background. The extension just talks to it:
|
|
126
|
+
|
|
127
|
+
1. Open any job posting on **LinkedIn**, **Indeed**, or **Greenhouse**.
|
|
128
|
+
2. Click the **Flash Resume** icon → **"⚡ Tailor 1-Page Resume"**. The company, role, and job description are auto-filled (including from text you've selected on the page). The verified PDF is saved directly to your configured folder and the saved path is shown — no download dialog.
|
|
129
|
+
|
|
130
|
+
The extension's built-in **Setup** wizard (first-run) lets you switch providers, update keys, or change the save folder at any time.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 🏗️ Architecture
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
flash-resume/
|
|
138
|
+
├── pyproject.toml # Package dependencies & scripts
|
|
139
|
+
├── README.md # Project documentation
|
|
140
|
+
├── templates/
|
|
141
|
+
│ └── resume.typ # Modern, ATS-optimized Typst template
|
|
142
|
+
├── extension/ # Manifest V3 Chrome Extension
|
|
143
|
+
│ ├── manifest.json
|
|
144
|
+
│ ├── popup.html / popup.js # Tailor UI + saved-path view (no download prompt)
|
|
145
|
+
│ ├── onboarding.html / onboarding.js # 6-step autosaving setup wizard
|
|
146
|
+
│ └── content.js
|
|
147
|
+
├── src/flash_resume/
|
|
148
|
+
│ ├── cli.py # Typer CLI (setup, init, tailor, serve, autostart, ...)
|
|
149
|
+
│ ├── config.py # ~/.config/flash-resume/config.json
|
|
150
|
+
│ ├── bootstrap.py # Silent server entrypoint (pythonw -m flash_resume.bootstrap)
|
|
151
|
+
│ ├── autostart.py # Windows Run-key registration for at-login server start
|
|
152
|
+
│ ├── extension.py # Bundled Chrome extension installer (Load-unpacked path)
|
|
153
|
+
│ ├── models/
|
|
154
|
+
│ │ ├── resume.py # MasterResume & structured components
|
|
155
|
+
│ │ ├── job.py # JobAnalysis & extracted specs
|
|
156
|
+
│ │ └── tailoring.py # TailorPlan, BulletEdit & TailorResult
|
|
157
|
+
│ ├── services/
|
|
158
|
+
│ │ ├── compiler.py # Typst compilation & pypdf page validation
|
|
159
|
+
│ │ ├── llm.py # Gemini Flash structured ATS optimization
|
|
160
|
+
│ │ ├── groq_llm.py # Groq (gpt-oss-20b) fast provider
|
|
161
|
+
│ │ ├── tailor.py # Pipeline orchestrator & diff generator
|
|
162
|
+
│ │ └── server.py # FastAPI companion daemon for Chrome Extension
|
|
163
|
+
│ └── utils/
|
|
164
|
+
│ └── diff.py # Rich terminal visualization
|
|
165
|
+
├── examples/
|
|
166
|
+
│ ├── master_resume.json # Realistic reference master resume
|
|
167
|
+
│ └── job_description.txt # Sample job description
|
|
168
|
+
└── tests/
|
|
169
|
+
├── test_models.py
|
|
170
|
+
├── test_compiler.py
|
|
171
|
+
└── test_tailor.py
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 🛡️ Product Principles
|
|
177
|
+
|
|
178
|
+
* **100% Factual Truthfulness**: The engine only maps keywords and rephrases bullets that align with existing experience. It never invents companies, degrees, metrics, or domains you haven't touched.
|
|
179
|
+
* **Layout-Preserving Word Budgets**: Replacement bullets are strictly constrained to $\pm 2$ words of the original bullet, preventing multi-line overflow.
|
|
180
|
+
* **Sub-100ms Local Compilation**: Pure local Typst compilation ensures blazing-fast rendering without waiting for external server queues.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 🧪 Testing
|
|
185
|
+
|
|
186
|
+
Run automated tests:
|
|
187
|
+
|
|
188
|
+
```powershell
|
|
189
|
+
uv run pytest
|
|
190
|
+
```
|
|
191
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Backend Software Engineer - Datadog
|
|
2
|
+
|
|
3
|
+
About the Role:
|
|
4
|
+
We are seeking a talented Backend Software Engineer to join our Core Infrastructure team. You will design, build, and maintain high-throughput distributed microservices handling telemetry and observability data at massive scale.
|
|
5
|
+
|
|
6
|
+
Key Responsibilities:
|
|
7
|
+
- Design and implement highly reliable REST and gRPC microservices using Python and Go.
|
|
8
|
+
- Optimize distributed storage systems, relational databases (PostgreSQL), and key-value datastores (Redis).
|
|
9
|
+
- Build and maintain CI/CD pipelines, containerized deployments using Docker and Kubernetes in AWS cloud environments.
|
|
10
|
+
- Drive latency optimization, p99 tail latency reduction, and observability monitoring using Prometheus/Grafana.
|
|
11
|
+
- Collaborate with product and platform teams to ensure 99.99% service availability.
|
|
12
|
+
|
|
13
|
+
Requirements & Qualifications:
|
|
14
|
+
- 2+ years of professional software engineering experience.
|
|
15
|
+
- Strong proficiency in Python (FastAPI / Django) or Go.
|
|
16
|
+
- Experience with PostgreSQL, query tuning, and Redis caching.
|
|
17
|
+
- Hands-on experience with cloud infrastructure (AWS) and containers (Docker, Kubernetes).
|
|
18
|
+
- Familiarity with CI/CD automation, distributed systems, and Kafka or message queues is a big plus.
|
|
19
|
+
- Bachelor's degree in Computer Science or equivalent practical experience.
|
|
20
|
+
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
{
|
|
2
|
+
"contact": {
|
|
3
|
+
"name": "Alex Chen",
|
|
4
|
+
"title": "Full Stack Software Engineer",
|
|
5
|
+
"email": "alex.chen@example.com",
|
|
6
|
+
"phone": "+1 (555) 234-5678",
|
|
7
|
+
"location": "San Francisco, CA",
|
|
8
|
+
"linkedin": "linkedin.com/in/alexchen-dev",
|
|
9
|
+
"github": "github.com/alexchen",
|
|
10
|
+
"portfolio": "alexchen.dev"
|
|
11
|
+
},
|
|
12
|
+
"summary": "Full Stack Engineer with 3+ years of experience designing high-throughput REST and GraphQL APIs, distributed backends, and responsive React web applications. Proven track record improving API response latency by 45% and optimizing database queries for millions of daily active users.",
|
|
13
|
+
"skills": [
|
|
14
|
+
{
|
|
15
|
+
"category": "Languages",
|
|
16
|
+
"items": ["Python", "TypeScript", "JavaScript", "Go", "SQL", "HTML/CSS"]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"category": "Frameworks & Libraries",
|
|
20
|
+
"items": ["FastAPI", "React", "Next.js", "Node.js", "Django", "Tailwind CSS"]
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"category": "Databases & Cloud",
|
|
24
|
+
"items": ["PostgreSQL", "Redis", "MongoDB", "AWS (S3, Lambda, ECS)", "Docker", "Kubernetes"]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"category": "Developer Tools",
|
|
28
|
+
"items": ["Git", "GitHub Actions", "CI/CD", "Linux", "Pytest", "Jest"]
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"experience": [
|
|
32
|
+
{
|
|
33
|
+
"id": "exp_cloudscale_swe",
|
|
34
|
+
"company": "CloudScale Technologies",
|
|
35
|
+
"role": "Software Engineer",
|
|
36
|
+
"location": "San Francisco, CA",
|
|
37
|
+
"start_date": "Aug 2022",
|
|
38
|
+
"end_date": "Present",
|
|
39
|
+
"bullets": [
|
|
40
|
+
"Architected scalable backend microservices using FastAPI and PostgreSQL, serving 12M+ monthly API requests with 99.98% uptime.",
|
|
41
|
+
"Implemented Redis distributed caching layer, reducing p99 API response latencies from 320ms to 48ms across key search endpoints.",
|
|
42
|
+
"Engineered automated CI/CD deployment pipelines using GitHub Actions and Docker, reducing team deployment cycle time by 40%.",
|
|
43
|
+
"Collaborated with cross-functional product and frontend teams to migrate monolithic legacy codebase into modular, decoupled services."
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "exp_nexustech_intern",
|
|
48
|
+
"company": "NexusTech Labs",
|
|
49
|
+
"role": "Software Engineering Intern",
|
|
50
|
+
"location": "San Jose, CA",
|
|
51
|
+
"start_date": "May 2021",
|
|
52
|
+
"end_date": "Aug 2021",
|
|
53
|
+
"bullets": [
|
|
54
|
+
"Developed customer-facing dashboard components in React and TypeScript, improving user engagement metrics by 28%.",
|
|
55
|
+
"Integrated third-party payment gateway and webhook reconciliation system with end-to-end transactional test coverage."
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"projects": [
|
|
60
|
+
{
|
|
61
|
+
"id": "proj_vector_search",
|
|
62
|
+
"name": "FlashSearch Engine",
|
|
63
|
+
"technologies": ["Python", "FastAPI", "PostgreSQL", "pgvector", "Docker"],
|
|
64
|
+
"link": "github.com/alexchen/flashsearch",
|
|
65
|
+
"bullets": [
|
|
66
|
+
"Engineered high-performance semantic search engine using FastAPI and pgvector, indexing over 500K documents with sub-60ms query response.",
|
|
67
|
+
"Constructed asynchronous document ingestion pipeline processing multi-format files with automated keyword extraction and chunking."
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "proj_task_orchestrator",
|
|
72
|
+
"name": "Distributed Job Scheduler",
|
|
73
|
+
"technologies": ["Go", "Redis", "Docker", "Prometheus"],
|
|
74
|
+
"link": "github.com/alexchen/job-orchestrator",
|
|
75
|
+
"bullets": [
|
|
76
|
+
"Built distributed task queue in Go backed by Redis Streams, supporting priority scheduling and automatic retry with exponential backoff.",
|
|
77
|
+
"Configured real-time system telemetry and Grafana dashboards tracking throughput, queue depth, and worker heartbeats."
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
"education": [
|
|
82
|
+
{
|
|
83
|
+
"institution": "University of California, Berkeley",
|
|
84
|
+
"degree": "B.S.",
|
|
85
|
+
"field_of_study": "Computer Science",
|
|
86
|
+
"start_date": "2018",
|
|
87
|
+
"end_date": "2022",
|
|
88
|
+
"gpa": "3.85",
|
|
89
|
+
"highlights": ["Data Structures", "Algorithms", "Operating Systems", "Database Systems"]
|
|
90
|
+
}
|
|
91
|
+
],
|
|
92
|
+
"certifications": [
|
|
93
|
+
"AWS Certified Solutions Architect – Associate",
|
|
94
|
+
"Certified Kubernetes Application Developer (CKAD)"
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Flash Resume - Intelligent Job Description Content Extractor
|
|
2
|
+
|
|
3
|
+
function extractJobDetails() {
|
|
4
|
+
const url = window.location.href;
|
|
5
|
+
let title = "";
|
|
6
|
+
let company = "";
|
|
7
|
+
let jd = "";
|
|
8
|
+
|
|
9
|
+
// 1. LinkedIn Job Page
|
|
10
|
+
if (url.includes("linkedin.com")) {
|
|
11
|
+
title = document.querySelector(".job-details-jobs-unified-top-card__job-title, .topcard__title, h1")?.innerText?.trim() || "";
|
|
12
|
+
company = document.querySelector(".job-details-jobs-unified-top-card__company-name, .topcard__org-name-link, .jobs-unified-top-card__company-name")?.innerText?.trim() || "";
|
|
13
|
+
jd = document.querySelector("#job-details, .jobs-description__content, .description__text")?.innerText?.trim() || "";
|
|
14
|
+
}
|
|
15
|
+
// 2. Indeed Job Page
|
|
16
|
+
else if (url.includes("indeed.com")) {
|
|
17
|
+
title = document.querySelector(".jobsearch-JobInfoHeader-title, h1")?.innerText?.trim() || "";
|
|
18
|
+
company = document.querySelector("[data-company-name='true'], .jobsearch-InlineCompanyRating-companyHeader")?.innerText?.trim() || "";
|
|
19
|
+
jd = document.querySelector("#jobDescriptionText, .jobsearch-jobDescriptionText")?.innerText?.trim() || "";
|
|
20
|
+
}
|
|
21
|
+
// 3. Greenhouse / Lever
|
|
22
|
+
else if (url.includes("greenhouse.io") || url.includes("lever.co")) {
|
|
23
|
+
title = document.querySelector(".app-title, .posting-headline h2, h1")?.innerText?.trim() || "";
|
|
24
|
+
company = document.querySelector(".company-name, .main-header-logo, .posting-headline")?.innerText?.trim() || "";
|
|
25
|
+
jd = document.querySelector("#content, .section-wrapper, .posting-description")?.innerText?.trim() || "";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Fallbacks: If user highlighted text, use the selection
|
|
29
|
+
const selectedText = window.getSelection().toString().trim();
|
|
30
|
+
if (selectedText.length > 50) {
|
|
31
|
+
jd = selectedText;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Generic fallback: grab largest text block or article/main
|
|
35
|
+
if (!jd) {
|
|
36
|
+
const mainEl = document.querySelector("article, main, .job-description, .description");
|
|
37
|
+
if (mainEl) {
|
|
38
|
+
jd = mainEl.innerText.trim();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return { title, company, jd };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Listen for messages from popup
|
|
46
|
+
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
|
47
|
+
if (request.action === "extract_job") {
|
|
48
|
+
const details = extractJobDetails();
|
|
49
|
+
sendResponse(details);
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
});
|
|
53
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifest_version": 3,
|
|
3
|
+
"name": "Flash Resume - 1-Click ATS Tailor",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"description": "Tailor your resume for any open job post and download a verified 1-page PDF in seconds.",
|
|
6
|
+
"permissions": [
|
|
7
|
+
"activeTab",
|
|
8
|
+
"scripting",
|
|
9
|
+
"downloads",
|
|
10
|
+
"storage"
|
|
11
|
+
],
|
|
12
|
+
"host_permissions": [
|
|
13
|
+
"http://127.0.0.1:8000/*",
|
|
14
|
+
"http://localhost:8000/*",
|
|
15
|
+
"https://*/*"
|
|
16
|
+
],
|
|
17
|
+
"action": {
|
|
18
|
+
"default_popup": "popup.html",
|
|
19
|
+
"default_title": "Flash Resume"
|
|
20
|
+
},
|
|
21
|
+
"content_scripts": [
|
|
22
|
+
{
|
|
23
|
+
"matches": ["https://*/*"],
|
|
24
|
+
"js": ["content.js"],
|
|
25
|
+
"run_at": "document_idle"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
|