⚡ Flash Resume
The job-post-to-1-page-PDF pipeline in one tap. ATS-targeted resume tailoring, layout-verified single-page PDFs, from your terminal or straight from the job page.
Precision of a human rewrite. Speed of a keystroke. Zero hallucinated experience.
🚪 Why Flash Resume
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.
Applying to jobs that way means juggling three tabs — job board, ChatGPT, and a LaTeX/Overleaf editor — then praying the result still fits on one page. When it doesn't, you're staring at an instant auto-reject.
Flash Resume kills that loop. It surgically injects the job's keywords into bullets you already have, compiles locally at sub-100ms, and verifies the single-page fit before you upload. What used to take a coffee break now takes one tap.
✨ What it does
| 🎯 Targeted ATS diffing | Injects high-density keywords from the job description directly into your existing skills and bullets — under a strict ±2-word budget so nothing overflows. |
| ⚡ Near-instant or top-quality | Pick Groq for a ~3s tailor, or Gemini for the absolute best ATS keyword quality (~5-9s). Switch anytime. |
| 📄 Verified 1-page PDF | Local Typst compilation in <100ms, then pypdf inspects the output to guarantee a true single-page fit — no page-2 surprises. |
| 🧩 1-click browser extension | A blue ⚡ button floats on LinkedIn, Indeed, and Greenhouse. One tap → PDF saved to your folder. No download dialog, no copy-paste. |
| 🔒 100% truthful | The engine only rephrases experience you actually have. It never fabricates companies, degrees, metrics, or domains. |
🧭 How it works
┌─────────────┐ mirror keyword ┌──────────────┐ compile ┌──────────────────┐ verify ┌───────────────┐
│ Job post │ ───────────────▶ │ Your master │ ──────────▶ │ Typst engine │ ─────────▶ │ 1-page PDF + │
│ (JD text) │ diff against │ resume │ (<0.1s) │ (bundled, local) │ (pypdf) │ review diff │
└─────────────┘ └──────────────┘ └──────────────────┘ └───────────────┘
▲ ▲
│ AI keyword plan (Gemini / Groq) │
│ │
clipboard / one-tap FAB / pasted text saved to your folder
The flow:
- You get the JD — copy it to your clipboard, or just tap the ⚡ button on a job page.
- Flash Resume reads it — auto-infers the target company and role.
- The AI maps keywords — matches JD terms against your master resume, the LLM (Gemini or Groq) selects high-impact ATS keywords that fit your real experience.
- It rewrites with discipline — surgically edits only relevant bullets/skills, keeping every rewrite within ±2 words and 100% truthful.
- It compiles & verifies — builds the PDF locally in <100ms and checks the output is exactly one page.
- You get everything —
Company_Role.pdf, a structured.json, and a.diff.mdreview report, plus a rich terminal diff showing exactly what changed.
🏗️ Architecture
High level — the extension is a thin client; all intelligence and configuration live in the local engine:
flowchart LR
subgraph Browser["Your browser (Chrome / Brave / Edge)"]
FAB["⚡ Floating button<br/>content.js"] -->|"one tap"| EXT["Extension<br/>popup.html"]
end
subgraph Local["Your machine — 127.0.0.1:13450"]
API["FastAPI companion daemon<br/>(fs serve)"] --> TAILOR["TailorEngine<br/>pipeline"]
TAILOR --> LLM{"AI provider"}
LLM -->|quality| GEM["Gemini Flash<br/>~5–9s"]
LLM -->|speed| GROQ["Groq gpt-oss-20b<br/>~3s"]
TAILOR --> TYPST["Typst compiler<br/><0.1s"] --> PYPDF["pypdf<br/>1-page verification"]
TYPST --> PDF["PDF + JSON + diff"]
end
EXT -->|fetch /api/tailor| API
FAB -->|fetch /api/tailor| API
PDF --> SAVE[("Your save folder")]
subgraph Config["Configuration & assets"]
CFG["config.json<br/>provider · key · save-folder"]
RES["Master resume"]
CFG -.->|read| API
RES -.->|read| TAILOR
end
Key design decision: your API key and master resume live only on the local server. The extension never sees them — it just POSTs the job description to 127.0.0.1:13450. Nothing leaves your machine except the JD you choose to send to your AI provider.
Project layout:
flash-resume/
├── pyproject.toml # Dependencies & fs scripts
├── templates/
│ └── resume.typ # Modern, ATS-optimized Typst template
├── extension/ # Manifest V3 Chrome extension
│ ├── manifest.json
│ ├── popup.html / js # Tailor UI + saved-path view
│ ├── content.js # Job extractor + one-tap ⚡ floating button
│ └── icons/ # "fr" toolbar icons (16/48/128)
├── src/flash_resume/
│ ├── cli.py # fs CLI (setup, init, tailor, serve, …)
│ ├── config.py # ~/.config/flash-resume/config.json
│ ├── bootstrap.py # Silent server entrypoint (pythonw -m …)
│ ├── autostart.py # Windows Run-key at-login registration
│ ├── extension.py # Bundled extension installer
│ ├── models/ # resume.py · job.py · tailoring.py
│ ├── services/
│ │ ├── compiler.py # Typst + pypdf page validation
│ │ ├── llm.py # Gemini Flash provider
│ │ ├── groq_llm.py # Groq gpt-oss-20b fast provider
│ │ ├── tailor.py # Pipeline orchestrator & diff generator
│ │ └── server.py # FastAPI companion daemon
│ └── utils/diff.py # Rich terminal visualization
├── examples/ # Sample master resume + JD
└── tests/ # test_models · test_compiler · test_tailor
🚀 Quick Start (Windows)
1 · Install
pip install flash-resume
That's it — the package bundles everything (Typst engine, AI clients, extension files). No extra dependencies.
2 · One-time setup
fs setup
A short interactive wizard that walks you through:
- AI provider — Gemini (quality) or Groq (speed), plus your free API key
- Save folder — where tailored PDFs land
- Master resume — loads your real resume (runs the
fs initwizard if you haven't yet) - Autostart — registers the engine to start silently at login, no terminal ever needed again
- Extension — copies the extension to a stable folder and prints where to load it
3 · Load the extension (once)
- Open
chrome://extensions/(works in Chrome, Brave, Edge) - Enable Developer mode (top-right toggle)
- Click Load unpacked and select the folder
fs setupprinted (default:%LOCALAPPDATA%\flash-resume\extension)
That's it. The engine autostarts at login and the extension reconnects automatically — no reloads, no terminal, no "keep this window open."
🧑💻 Daily usage
The one-tap way (fastest)
Open any job on LinkedIn, Indeed, or Greenhouse and tap the ⚡ floating button in the bottom-right corner. Flash Resume auto-detects the job, tailors, and shows a toast with your ATS score and saved path.
The detailed way (review / retry)
Open the popup and hit "⚡ Tailor 1-Page Resume" — company, role, and JD are auto-filled (including anything you've text-selected on the page).
The terminal way (everywhere else)
Copy the job description (Ctrl+C), then:
fs tailor
Flash Resume reads the clipboard, infers the company/role, tailors, and drops three files in your save folder:
| File | What it is |
|---|---|
Company_Role.pdf |
✅ Ready to upload |
Company_Role.json |
Structured tailored resume |
Company_Role.diff.md |
Reviewable before/after report |
…plus a rich terminal diff:
✓ Flash Resume Tailoring Complete
Datadog — Backend Software Engineer
ATS Match Score: 94% | Pages: 1 page (Layout Verified) | Compile: 72.5ms | Total: 1.84s
Integrated ATS Keywords: FastAPI PostgreSQL Docker Redis
Handy overrides
# Tailor from a file or string instead of the clipboard
fs tailor --jd ./jobs/datadog_swe.txt
# Paste a long JD safely (quotes & apostrophes included)
Get-Content ./jobs/joveo.txt | fs tailor --jd -
cat ./jobs/joveo.txt | fs tailor --jd - # Git Bash
# Override company / role
fs tailor --company "Google" --role "Site Reliability Engineer"
# Custom output folder
fs tailor --out ./applications/2026/
🛠️ CLI reference
| Command | What it does |
|---|---|
fs setup |
Interactive one-time configuration (provider, key, save folder, resume, autostart, extension) |
fs init |
Create/edit your master resume |
fs import |
Bring in an existing resume |
fs tailor |
Read JD → tailor → verified 1-page PDF (clipboard by default) |
fs serve |
Run the local engine on 127.0.0.1:13450 (the extension needs it) |
fs doctor |
Check that everything is healthy |
fs autostart status |
Is the at-login autostart registered? |
fs autostart enable / disable |
Turn the at-login engine on / off |
fs extension-path |
Print the folder to load in chrome://extensions |
fs --version |
Show version |
🛡️ Product principles
- 100% factual — the engine only maps keywords and rephrases bullets that match your real experience. It never invents companies, degrees, metrics, or domains.
- Layout-preserving budgets — every replacement bullet is constrained to ±2 words of the original, so the layout can't blow up.
- Sub-100ms local compilation — pure local Typst, no external render queues.
- Local-first & private — your key and resume never leave your machine except for the JD you choose to send your AI provider.
🧪 Development
git clone https://github.com/PavanBollepalli/flash-resume.git
cd flash-resume
uv sync
uv run fs init
uv run fs doctor
uv run pytest
🙌 Contributing
Found a bug, want a new job-board parser, or a macOS/Linux heartbeat? Open an issue or a PR. Contributions of the "it still fits on one page" energy are especially welcome. ⚡
Made for people who'd rather be applying than reformatting. ⭐ Star it, fork it, take a job with it.
Release files for flash-resume 0.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| flash_resume-0.2.4.tar.gz | 153.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| flash_resume-0.2.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 209.5 kB
Release files / flash_resume-0.2.4.tar.gz
| Download URL | flash_resume-0.2.4.tar.gz |
|---|---|
| Size | 153.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b4bc3f2efd1f81786341d9b8328c5b8414c34e76671b664908222c1e97c0ca53
|
|
BLAKE2b-256 checksum How to use checksums |
770e8b1ea5e9ad064e641566dbed06a7cb587ace6ae40d1e9602c0603046a062
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / flash_resume-0.2.4-py3-none-any.whl
| Download URL | flash_resume-0.2.4-py3-none-any.whl |
|---|---|
| Size | 56.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e85effc5d9d6be75bf36ad7f31502c46f2bfe827393844ea66723da2920961b8
|
|
BLAKE2b-256 checksum How to use checksums |
c098a3cd2b5c3253c5ee3410f895b564c6dd4cd19feb92725d8e72f36447fd38
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency log