tailorbirdcv 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.
- tailorbirdcv-0.2.0/.gitignore +56 -0
- tailorbirdcv-0.2.0/CHANGELOG.md +37 -0
- tailorbirdcv-0.2.0/PKG-INFO +188 -0
- tailorbirdcv-0.2.0/README.md +152 -0
- tailorbirdcv-0.2.0/VERSION +1 -0
- tailorbirdcv-0.2.0/hatch_build.py +19 -0
- tailorbirdcv-0.2.0/pyproject.toml +71 -0
- tailorbirdcv-0.2.0/tailorbirdcv/__init__.py +1 -0
- tailorbirdcv-0.2.0/tailorbirdcv/ai.py +844 -0
- tailorbirdcv-0.2.0/tailorbirdcv/api.py +1471 -0
- tailorbirdcv-0.2.0/tailorbirdcv/apikey.py +120 -0
- tailorbirdcv-0.2.0/tailorbirdcv/ats.py +76 -0
- tailorbirdcv-0.2.0/tailorbirdcv/backup.py +244 -0
- tailorbirdcv-0.2.0/tailorbirdcv/cli.py +466 -0
- tailorbirdcv-0.2.0/tailorbirdcv/critique.py +256 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/README.md +12 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/config/industries.yaml +73 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/config/packs/cybersecurity/industries.yaml +45 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/config/packs/cybersecurity/tracks.yaml +23 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/config/tracks.yaml +23 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/fonts/Carlito-Bold.ttf +0 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/fonts/Carlito-BoldItalic.ttf +0 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/fonts/Carlito-Italic.ttf +0 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/fonts/Carlito-Regular.ttf +0 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/fonts/Gelasio-Bold.ttf +0 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/fonts/Gelasio-BoldItalic.ttf +0 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/fonts/Gelasio-Italic.ttf +0 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/fonts/Gelasio-Regular.ttf +0 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/fonts/OFL-Carlito.txt +94 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/fonts/OFL-Gelasio.txt +93 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/templates/base.docx +0 -0
- tailorbirdcv-0.2.0/tailorbirdcv/data/words.txt.gz +0 -0
- tailorbirdcv-0.2.0/tailorbirdcv/demo.py +180 -0
- tailorbirdcv-0.2.0/tailorbirdcv/doctor.py +326 -0
- tailorbirdcv-0.2.0/tailorbirdcv/engine.py +1049 -0
- tailorbirdcv-0.2.0/tailorbirdcv/factcheck.py +1247 -0
- tailorbirdcv-0.2.0/tailorbirdcv/favicon.py +172 -0
- tailorbirdcv-0.2.0/tailorbirdcv/fit.py +96 -0
- tailorbirdcv-0.2.0/tailorbirdcv/identify.py +107 -0
- tailorbirdcv-0.2.0/tailorbirdcv/importer.py +461 -0
- tailorbirdcv-0.2.0/tailorbirdcv/ingest.py +336 -0
- tailorbirdcv-0.2.0/tailorbirdcv/jobfetch.py +632 -0
- tailorbirdcv-0.2.0/tailorbirdcv/layout.py +275 -0
- tailorbirdcv-0.2.0/tailorbirdcv/oscompat.py +175 -0
- tailorbirdcv-0.2.0/tailorbirdcv/paths.py +40 -0
- tailorbirdcv-0.2.0/tailorbirdcv/pdf.py +569 -0
- tailorbirdcv-0.2.0/tailorbirdcv/privacy.py +161 -0
- tailorbirdcv-0.2.0/tailorbirdcv/render.py +334 -0
- tailorbirdcv-0.2.0/tailorbirdcv/schema.py +326 -0
- tailorbirdcv-0.2.0/tailorbirdcv/store.py +1394 -0
- tailorbirdcv-0.2.0/tailorbirdcv/themes.py +130 -0
- tailorbirdcv-0.2.0/tailorbirdcv/update.py +216 -0
- tailorbirdcv-0.2.0/web/dist/apple-touch-icon.png +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-cyrillic-400-normal-C51Di1Mf.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-cyrillic-400-normal-CPJFfJgk.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-cyrillic-500-normal-D2cXvDHF.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-cyrillic-500-normal-DfuvdVgn.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-cyrillic-600-normal-Dfv53e6N.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-cyrillic-600-normal-DzvMIgFZ.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-latin-400-normal-B2yvC1Cq.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-latin-400-normal-DTRLJnHl.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-latin-500-normal-D-GG86Jb.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-latin-500-normal-YINYabwD.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-latin-600-normal-V-KvD_pi.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-latin-600-normal-bZn07FKM.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-latin-ext-400-normal-CfzLURNc.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-latin-ext-400-normal-DI-rJ0UV.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-latin-ext-500-normal-Buglb9-a.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-latin-ext-500-normal-CrWEgvU_.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-latin-ext-600-normal-B7ybHiTt.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-latin-ext-600-normal-TphwrhF8.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-symbols2-400-normal-DjbiTEEA.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-symbols2-500-normal-CmnCPGa0.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-symbols2-600-normal-D7I4D0GJ.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-vietnamese-400-normal-CZEPLOgu.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-vietnamese-500-normal-Dx9-epDo.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/geist-mono-vietnamese-600-normal-BLL01lwa.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/index-CorFW1kA.js +32 -0
- tailorbirdcv-0.2.0/web/dist/assets/index-MTpjngoD.css +1 -0
- tailorbirdcv-0.2.0/web/dist/assets/instrument-sans-latin-ext-wdth-italic-Bgl-Q8lL.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/instrument-sans-latin-ext-wdth-normal-C5E2Gvlv.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/instrument-sans-latin-wdth-italic-Dc9nmmPR.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/instrument-sans-latin-wdth-normal-BVScPF0l.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/outfit-latin-600-normal-B7SfZ07L.woff2 +0 -0
- tailorbirdcv-0.2.0/web/dist/assets/outfit-latin-600-normal-BEfTtDA7.woff +0 -0
- tailorbirdcv-0.2.0/web/dist/favicon.svg +16 -0
- tailorbirdcv-0.2.0/web/dist/index.html +15 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# ---- TailorbirdCV: personal data never enters the repository ----------------------------------
|
|
2
|
+
# The data folder (profile, applications, settings, access key) and the owner's local notes.
|
|
3
|
+
private/
|
|
4
|
+
CLAUDE.local.md
|
|
5
|
+
.access-key
|
|
6
|
+
# Resumes and their outputs anywhere in the tree; the only Word file shipped is the empty template.
|
|
7
|
+
*.pdf
|
|
8
|
+
*.docx
|
|
9
|
+
!tailorbirdcv/data/templates/base.docx
|
|
10
|
+
*.doc
|
|
11
|
+
*.rtf
|
|
12
|
+
*.odt
|
|
13
|
+
# Word and LibreOffice lock files
|
|
14
|
+
~$*
|
|
15
|
+
.~lock.*#
|
|
16
|
+
|
|
17
|
+
# ---- Secrets -------------------------------------------------------------------------------
|
|
18
|
+
.env
|
|
19
|
+
.env.*
|
|
20
|
+
.envrc
|
|
21
|
+
*.pem
|
|
22
|
+
*.key
|
|
23
|
+
*.p12
|
|
24
|
+
.pypirc
|
|
25
|
+
|
|
26
|
+
# ---- Python ----------------------------------------------------------------------------------
|
|
27
|
+
__pycache__/
|
|
28
|
+
*.py[cod]
|
|
29
|
+
.venv/
|
|
30
|
+
venv/
|
|
31
|
+
build/
|
|
32
|
+
dist/
|
|
33
|
+
*.egg-info/
|
|
34
|
+
.eggs/
|
|
35
|
+
.pytest_cache/
|
|
36
|
+
.coverage
|
|
37
|
+
.coverage.*
|
|
38
|
+
htmlcov/
|
|
39
|
+
.ruff_cache/
|
|
40
|
+
.mypy_cache/
|
|
41
|
+
|
|
42
|
+
# ---- Node (web/ has its own .gitignore for node_modules and dist) ----------------------------
|
|
43
|
+
node_modules/
|
|
44
|
+
*.log
|
|
45
|
+
|
|
46
|
+
# ---- Editors and operating systems -------------------------------------------------------------
|
|
47
|
+
.vscode/
|
|
48
|
+
.idea/
|
|
49
|
+
*.swp
|
|
50
|
+
.DS_Store
|
|
51
|
+
Thumbs.db
|
|
52
|
+
desktop.ini
|
|
53
|
+
|
|
54
|
+
# ---- Claude Code: local settings and worktrees -------------------------------------------------
|
|
55
|
+
.claude/settings.local.json
|
|
56
|
+
.claude/worktrees/
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.2.0 — 2026-10-07 (first release on PyPI)
|
|
4
|
+
- **Cover letters** (new Workspace step): a one-page letter in your resume's design and the tone you pick (Formal, Warm, Direct), drafted by the AI and checked sentence by sentence: what it says about you cites your evidence, what it says about the company comes from the posting, and the greeting, closing and sign-off are written by TailorbirdCV. Edit any sentence with its sources beside it; build it as Word and PDF; it's frozen with the resume when you apply.
|
|
5
|
+
- **Safer against hostile job postings:** a claim must stay close to the evidence it cites (most of its words from its sources), and text addressed to a reader or an AI ("ignore previous instructions", "shortlist this candidate") is refused, so a posting can't plant sentences in your resume. Job-posting text is marked as data, never instructions, in every AI prompt, and text hidden from people on a job page (zero-size, transparent, off-screen) is left out.
|
|
6
|
+
- **Privacy mode (experimental)** (Settings → Privacy, on by default): your name, email, phone, street address and personal links are replaced by placeholders in everything sent to the AI and put back in its answers, so they never reach Anthropic or OpenAI while your resume still shows them. The setup wizard asks for your name before reading your CV; Settings shows exactly what the AI receives. Your contact block is no longer sent to the AI at all.
|
|
7
|
+
- **Backup and restore** (Settings → Backup & restore, or `tailorbirdcv backup` / `tailorbirdcv restore`): your whole profile, memory, applications (with what you sent), settings and history as one .zip, and restore on another computer straight from the setup wizard's first page. API keys are included only if you tick the box. Restoring checks the file first and never deletes anything: the data it replaces is kept in `before-restore/`. Every backup warns that the file isn't encrypted and must be kept safe.
|
|
8
|
+
- **Resumes fit their page limit reliably.** The length estimate now lays the resume out the way Word does (real font widths and line heights, spacing, page breaks), so a 1-page resume no longer spills onto a second page and a 2-page resume fills its second page (about 85–95% instead of 70–80%). Corrections learned from earlier builds start over. No resume text is smaller than 9.5 pt any more (Classic at the Standard size keeps its original 8.5 pt contact line and dates); a contact line too long for one line wraps between items. A Word conversion that fails with "Message not understood" is retried once.
|
|
9
|
+
- **A friendlier wait:** while the AI works, the tailorbird hops along its leaf sewing the stitch; while documents are built, the stitch runs around a page. With the system's *reduce motion* setting on, the stitch still sews but the bird stands still.
|
|
10
|
+
- **AutoCV is now TailorbirdCV**, with a new logo and colours. The PyPI package and the command are both `tailorbirdcv` (`tailorbirdcv serve`), environment variables start with `TAILORBIRDCV_`, and the repository is github.com/atenreiro/tailorbirdcv. API keys saved in the keychain under the old name move over the first time they're used.
|
|
11
|
+
- **Company icons:** applications made from a job link show the company's site icon on the board, in the table and in the detail panel, fetched once from the company's own website (never a job board's logo). SVG icons work too, and sites that block plain requests are read through the headless browser when it's installed. Without one, nothing changes. Settings → Applications → Show company icons turns them off (and stops fetching).
|
|
12
|
+
- **Fixes from an architecture review:** marking an application applied or freezing a copy while it builds no longer hangs TailorbirdCV (lock order and the server loop); a draft that fails the fact-check no longer makes compose fail with an error; Claude Code is checked before every AI call and never used on a pay-per-use login (Console, Bedrock, Vertex); the private link only ever redirects within TailorbirdCV; the request log masks the link's key.
|
|
13
|
+
- **Updates:** TailorbirdCV tells you when a new version is out, and copies installed with the one-line installer upgrade with one click: it downloads the new version, restarts on the same port and the page reloads. It asks PyPI for the latest version at most once a day; Settings → About TailorbirdCV shows the version and turns checks off. The version now lives in a `VERSION` file, and bumping it on main publishes the release automatically once CI passes.
|
|
14
|
+
- The optional headless browser installs only Chromium's headless shell, the part TailorbirdCV uses: about 200 MB instead of 550 MB. The setup wizard no longer leaves an empty `setup/` folder behind.
|
|
15
|
+
- **Identify a PDF** (Applications): drop in any resume PDF to see which application it came from: the exact file sent (SHA-256), the same PDF re-saved by another app (its document id), or the closest text. Sent copies record each file's SHA-256, shown under *Sent copies* in Export. Nothing is added to your PDFs.
|
|
16
|
+
- **Runs on macOS, Windows and Linux.** Word is driven hidden on macOS (AppleScript) and Windows (COM); LibreOffice works everywhere, with metric-compatible stand-ins (Gelasio, Carlito) when Microsoft's fonts are missing, so page breaks match Word's.
|
|
17
|
+
- **Choose the PDF engine** (Word or LibreOffice) in the new Settings page; Word is the default when both are installed.
|
|
18
|
+
- **One-command install:** `curl -LsSf …/install.sh | sh` on macOS and Linux, `irm …/install.ps1 | iex` on Windows: the installer sets up uv if needed, installs `tailorbirdcv` from PyPI on a uv-managed Python 3.13 (never the system's or Homebrew's), puts `tailorbirdcv` on the PATH and starts TailorbirdCV, with no administrator rights; it trusts the system's certificates (company proxies), refuses to update or remove a running TailorbirdCV and to run under sudo, and says when uv is too old. Running it again updates. Or directly `uv tool install tailorbirdcv` (or `pipx install tailorbirdcv`). The web UI ships inside the package, so Node isn't needed. User data lives in the OS's per-user data folder.
|
|
19
|
+
- `tailorbirdcv doctor` (also under Settings → System check) explains what's missing and how to fix it; `tailorbirdcv install-browser` installs the optional headless browser.
|
|
20
|
+
- The fact-check's word list is bundled, so it behaves identically on every OS.
|
|
21
|
+
- **Works for anyone:** a Welcome page imports any resume (.docx, PDF or text) through the AI, word-for-word, flagging anything that doesn't match the original; or start blank. Settings → *Your targets* (field, seniority, target roles, region, US/UK spelling, 1–3 page limit, domain pack) replaces the built-in cybersecurity/APAC assumptions; the original emphasis lives on as the *Cybersecurity* pack.
|
|
22
|
+
- **Resume themes**: Classic (the original design, unchanged), Modern and Compact, on US Letter or A4 (Settings → Resume design). Length estimates follow the theme and paper.
|
|
23
|
+
- **Setup wizard** on first run: connect Claude, upload your CV, review every line (anything not word-for-word in your file must be fixed, removed or confirmed; the server checks again), targets suggested from your CV, design, and final checks with a one-click headless-browser install. Progress and the imported draft survive a refresh.
|
|
24
|
+
- Robustness: Windows Word conversions take paths via environment variables, report errors as plain text and stop the Word instance they started on a timeout; Carlito ships with TailorbirdCV (Calibri stand-in on Linux); a re-created profile never reuses old ids; Word's lock file survives rebuilds; the CLI reports PDF failures with exit code 3 instead of a traceback; the release workflow runs the tests first, and CI covers Python 3.11.
|
|
25
|
+
- **Choice of AI engine** (Settings → AI engine): Claude Code on your subscription, or an Anthropic API key (pay per use), stored in the OS keychain. Switching takes effect immediately; *Test* checks it.
|
|
26
|
+
- **Resumes fill their pages better.** The length budget is what your page limit actually holds in the chosen design (it used to follow your original resume's length, which left Compact resumes a sixth short). Every PDF build is measured, and TailorbirdCV learns how many lines each design really fits. Export shows how full the last page is, and *Fill the page with AI* proposes relevant evidence you haven't used yet, fact-checked, for you to review. Headings never end up alone at the bottom of a page.
|
|
27
|
+
- **Add roles in Master profile → Experience**: company, location, dates, title, a scope line and 1–10 resume bullets. New roles get ids from the company name (`acme-bank`, `acme-bank.a1`…), never a retired one; roles can be reordered (↑ ↓) and deleted, and a role without a scope line can get one.
|
|
28
|
+
- **More AI engines** (Settings → AI engine, and the setup wizard's *Connect your AI*): Codex on your ChatGPT subscription, an OpenAI API key, or an OpenRouter key (the same Claude model by default, routed to zero-data-retention providers). Schemas are sent in OpenAI's strict form; every answer is still validated and fact-checked. Each provider's key has its own keychain entry. Windows: reads no longer fail when they race a save.
|
|
29
|
+
- **Setup checks this computer first** (new step *Your computer*): what you have and what you need — every AI option (installed, logged in, key saved), PDF engine with a one-click *Test PDF*, keychain, headless browser (exact version, with *Install*), Node.js — marked required, recommended or optional, re-checking itself as you install. *Connect your AI* can send one real test request. Claude Code and Codex installed after TailorbirdCV started are found without a restart.
|
|
30
|
+
- **Stricter never-invent checks:** leadership, ownership, credential and scope words in any form; numbers kept with what they count; titles kept with their employer; product names that are also words; stricter import verification (decimals, symbols, each role in its own part of the CV). Fill and trim can only add or only remove.
|
|
31
|
+
- **Privacy and security:** TailorbirdCV opens through a private link and only answers that browser; the data folder is owner-only; fonts ship with the app (no Google Fonts); job pages render in a sandboxed browser without WebRTC.
|
|
32
|
+
- **Setup on macOS and Windows:** Claude Code installed with npm on Windows works again (its package now ships claude.exe); CLIs and Node installed after TailorbirdCV started (Homebrew, nvm, fnm, pnpm, Volta, WinGet, Scoop) are found and run with Node on their PATH; Claude Code counts as ready only on a subscription login; `tailorbirdcv serve` claims its port before opening its private link; keychain prompts never freeze the server and a locked keychain says so; Word's Test PDF explains the hidden prompts, macOS Automation permission, and offers LibreOffice when it fails; a hung Word on Windows is cleaned up; .rtf/.doc/.odt CVs are read on macOS, .txt in any common encoding; per-OS install commands and environment-variable syntax.
|
|
33
|
+
- **Text size** (Settings → Resume design): *Comfortable* (the default) makes body text 1 pt larger — 10.5 pt in Classic and Modern — for easier reading; *Standard* keeps each design as drawn (Classic byte-for-byte). Length budgets, page measurements and Fill follow the size.
|
|
34
|
+
- Output files keep accented and non-Latin names (José → `Jose_…`, not `Jos_…`).
|
|
35
|
+
|
|
36
|
+
## 0.1.0 (not published)
|
|
37
|
+
- First version: fact-locked tailoring, gap questions, memory, hiring-manager review, sent copies and history.
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: tailorbirdcv
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Tailor your resume to a job description without inventing anything — a local web app
|
|
5
|
+
Project-URL: Homepage, https://github.com/atenreiro/tailorbirdcv
|
|
6
|
+
Project-URL: Changelog, https://github.com/atenreiro/tailorbirdcv/blob/main/CHANGELOG.md
|
|
7
|
+
Project-URL: Issues, https://github.com/atenreiro/tailorbirdcv/issues
|
|
8
|
+
Keywords: ats,claude,cv,job application,openai,openrouter,resume
|
|
9
|
+
Classifier: Development Status :: 4 - Beta
|
|
10
|
+
Classifier: Environment :: Web Environment
|
|
11
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
12
|
+
Classifier: Operating System :: MacOS
|
|
13
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
14
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Office/Business
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Requires-Dist: anthropic>=1.11
|
|
22
|
+
Requires-Dist: beautifulsoup4>=4.12
|
|
23
|
+
Requires-Dist: fastapi>=0.115
|
|
24
|
+
Requires-Dist: httpx>=0.27
|
|
25
|
+
Requires-Dist: keyring>=25
|
|
26
|
+
Requires-Dist: openai>=3.24
|
|
27
|
+
Requires-Dist: platformdirs>=4.0
|
|
28
|
+
Requires-Dist: playwright>=1.48
|
|
29
|
+
Requires-Dist: pydantic>=2.6
|
|
30
|
+
Requires-Dist: pypdf>=4.0
|
|
31
|
+
Requires-Dist: python-docx>=1.1
|
|
32
|
+
Requires-Dist: pyyaml>=6.0
|
|
33
|
+
Requires-Dist: truststore>=0.10
|
|
34
|
+
Requires-Dist: uvicorn>=0.30
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
36
|
+
|
|
37
|
+
<p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/atenreiro/tailorbirdcv/v0.2.0/docs/logo-dark.png"><img src="https://raw.githubusercontent.com/atenreiro/tailorbirdcv/v0.2.0/docs/logo.png" alt="TailorbirdCV" width="420"></picture></p>
|
|
38
|
+
|
|
39
|
+
# TailorbirdCV
|
|
40
|
+
|
|
41
|
+
**Tailor your resume to each job, without inventing anything.**
|
|
42
|
+
|
|
43
|
+
Give TailorbirdCV your CV once. Then, for each job, paste the posting's link. TailorbirdCV:
|
|
44
|
+
- works out what the role cares about;
|
|
45
|
+
- asks you about anything the job wants that your CV doesn't show;
|
|
46
|
+
- writes a tailored resume from your real experience (and a cover letter, if you want one);
|
|
47
|
+
- builds a Word document and a PDF, ready to send.
|
|
48
|
+
|
|
49
|
+
A built-in fact-check makes sure every line comes from your own CV: no made-up numbers, tools, employers or claims. Your name, employers, job titles, dates and education are copied exactly.
|
|
50
|
+
|
|
51
|
+
TailorbirdCV runs on your own computer (macOS, Windows or Linux) and opens in your browser. The writing is done by the AI you choose.
|
|
52
|
+
|
|
53
|
+

|
|
54
|
+
|
|
55
|
+
## How it works
|
|
56
|
+
<picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/atenreiro/tailorbirdcv/v0.2.0/docs/how-it-works-dark.png"><img src="https://raw.githubusercontent.com/atenreiro/tailorbirdcv/v0.2.0/docs/how-it-works.png" alt="How TailorbirdCV works. You give it your CV once, then a job posting and your answers to its questions. On your computer, TailorbirdCV keeps your master profile (the only source of facts), reads the job, asks about gaps, writes a draft, fact-checks every line against your profile and builds a Word document and PDF of your tailored resume and cover letter. The AI you choose (Claude or ChatGPT with your subscription, or an API key from Anthropic, OpenAI or OpenRouter) sees only the job and your CV's content; Privacy mode (optional and experimental) replaces your name, email, phone and links with placeholders before anything is sent."></picture>
|
|
57
|
+
|
|
58
|
+
Everything except the AI runs on your computer. Your CV becomes your **master profile**, the only place facts come from. The AI reads the job and writes the draft; TailorbirdCV checks every line against your profile before you see it.
|
|
59
|
+
|
|
60
|
+
## What you need
|
|
61
|
+
1. **An AI**, any one of:
|
|
62
|
+
- a **Claude** subscription, with [Claude Code](https://claude.com/claude-code) installed and logged in. No extra cost;
|
|
63
|
+
- a **ChatGPT** subscription, with [Codex](https://github.com/openai/codex) installed and logged in. No extra cost;
|
|
64
|
+
- an **API key** from [Anthropic](https://console.anthropic.com/), [OpenAI](https://platform.openai.com/) or [OpenRouter](https://openrouter.ai/), paid per use. It's kept in your computer's keychain.
|
|
65
|
+
2. **Something to make PDFs**: Microsoft Word, or the free [LibreOffice](https://www.libreoffice.org/). Without either, you still get the Word document.
|
|
66
|
+
|
|
67
|
+
Not sure what you have? Install TailorbirdCV first: its setup wizard checks and shows how to add anything missing.
|
|
68
|
+
|
|
69
|
+
## Install
|
|
70
|
+
**macOS or Linux:** open **Terminal**, paste this line and press Return:
|
|
71
|
+
```bash
|
|
72
|
+
curl -LsSf https://raw.githubusercontent.com/atenreiro/tailorbirdcv/main/install.sh | sh
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Windows:** open **PowerShell** (a normal window, not as administrator), paste this line and press Enter:
|
|
76
|
+
```powershell
|
|
77
|
+
irm https://raw.githubusercontent.com/atenreiro/tailorbirdcv/main/install.ps1 | iex
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
After a minute or two, TailorbirdCV opens in your browser. Keep the Terminal or PowerShell window open while you use it.
|
|
81
|
+
|
|
82
|
+
<details>
|
|
83
|
+
<summary>What the installer does</summary>
|
|
84
|
+
|
|
85
|
+
The scripts are short enough to read first: [install.sh](https://github.com/atenreiro/tailorbirdcv/blob/main/install.sh) and [install.ps1](https://github.com/atenreiro/tailorbirdcv/blob/main/install.ps1). They:
|
|
86
|
+
- install [uv](https://docs.astral.sh/uv/) (Astral's open-source Python installer) if you don't have it;
|
|
87
|
+
- install TailorbirdCV from PyPI in its own environment, with its own Python 3.13. Any Python already on your computer is left alone;
|
|
88
|
+
- add the `tailorbirdcv` command and start it.
|
|
89
|
+
|
|
90
|
+
They need no administrator rights, write only inside your user folder, and use your computer's own certificates, so they also work on company networks that inspect HTTPS.
|
|
91
|
+
|
|
92
|
+
Prefer to do it yourself? Install uv (`brew install uv`, `winget install astral-sh.uv`, or [another way](https://docs.astral.sh/uv/getting-started/installation/)), open a new terminal, then run `uv tool install --python 3.13 tailorbirdcv` and `tailorbirdcv serve`.
|
|
93
|
+
</details>
|
|
94
|
+
|
|
95
|
+
## Start, stop and update
|
|
96
|
+
- **Start:** run `tailorbirdcv serve` in Terminal or PowerShell. Your browser opens TailorbirdCV through a private link (also printed in the terminal) that unlocks it in that browser only.
|
|
97
|
+
- **Stop:** press **Ctrl+C** in that window, or close it.
|
|
98
|
+
- **Update:** when a new version is out, TailorbirdCV says so at the top of the page. Click **Upgrade** and it restarts by itself. To know, it asks PyPI for the latest version number at most once a day; nothing about you is sent. You can turn this off in **Settings → About TailorbirdCV**.
|
|
99
|
+
- **Check your setup:** `tailorbirdcv doctor`.
|
|
100
|
+
|
|
101
|
+
<details>
|
|
102
|
+
<summary>Uninstall</summary>
|
|
103
|
+
|
|
104
|
+
Stop TailorbirdCV, then run:
|
|
105
|
+
- macOS or Linux:
|
|
106
|
+
```bash
|
|
107
|
+
curl -LsSf https://raw.githubusercontent.com/atenreiro/tailorbirdcv/main/install.sh | sh -s -- --uninstall
|
|
108
|
+
```
|
|
109
|
+
- Windows:
|
|
110
|
+
```powershell
|
|
111
|
+
$env:TAILORBIRDCV_UNINSTALL = "1"; irm https://raw.githubusercontent.com/atenreiro/tailorbirdcv/main/install.ps1 | iex
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
`uv tool uninstall tailorbirdcv` does the same. Your profile and applications stay in your [data folder](#your-data-and-privacy) until you delete it. uv stays installed; [Astral explains how to remove it](https://docs.astral.sh/uv/getting-started/installation/#uninstallation).
|
|
115
|
+
</details>
|
|
116
|
+
|
|
117
|
+
## First run
|
|
118
|
+
A short setup wizard (about 5 minutes) checks your computer, connects your AI, reads your CV, then asks about your targets (field, seniority, region, spelling, page limit) and a design (Classic, Modern or Compact).
|
|
119
|
+
|
|
120
|
+
Your CV is copied word for word, never rewritten. Nothing is saved until you've checked it: any line that doesn't match your file exactly is highlighted for you to fix or confirm.
|
|
121
|
+
|
|
122
|
+
Moving from another computer? Choose **Restore from a backup** on the wizard's first page.
|
|
123
|
+
|
|
124
|
+

|
|
125
|
+
|
|
126
|
+
## Tailoring a resume
|
|
127
|
+
1. Click **New tailoring** and paste the job posting's link (or its text).
|
|
128
|
+
2. **Brief:** see what the role wants and how your experience matches.
|
|
129
|
+
3. **Gaps:** answer questions about what the job wants and your profile doesn't show. No experience? Say so: it stays a gap.
|
|
130
|
+
4. **Review:** read the draft, click any line to edit it, and optionally ask for a hiring-manager review.
|
|
131
|
+
5. **Cover letter** (optional): one page in the same design, in a Formal, Warm or Direct tone, checked sentence by sentence like your resume.
|
|
132
|
+
6. **Export:** build the Word document and PDF. Too long? **Trim with AI**. Room to spare? **Fill the page with AI**. Both show their suggestions in Review before anything changes.
|
|
133
|
+
|
|
134
|
+
Then track it under **Applications**. Marking an application *applied* keeps a read-only copy of exactly what you sent. Found one of your resumes and not sure which version it is? **Identify a PDF** tells you which application it came from.
|
|
135
|
+
|
|
136
|
+

|
|
137
|
+
|
|
138
|
+

|
|
139
|
+
|
|
140
|
+
The screenshots use a fictional profile and job posting.
|
|
141
|
+
|
|
142
|
+
## Your data and privacy
|
|
143
|
+
> [!IMPORTANT]
|
|
144
|
+
> **The only thing that leaves your computer is what the AI needs to read your CV and the job, and to write the resume.**
|
|
145
|
+
|
|
146
|
+
There's no account, no server and no tracking. Your profile, applications and settings are kept in:
|
|
147
|
+
- macOS: `~/Library/Application Support/TailorbirdCV`
|
|
148
|
+
- Windows: `%LOCALAPPDATA%\TailorbirdCV`
|
|
149
|
+
- Linux: `~/.local/share/TailorbirdCV`
|
|
150
|
+
|
|
151
|
+
**Privacy mode** (on by default, **experimental**): your name, email, phone, address and personal links are replaced with placeholders like `[NAME]` before anything is sent to the AI, and put back afterwards, so your resume still shows them. Your career history is still sent and can identify you, and an unusual spelling can slip through, so use it with care. **Settings → Privacy → See what the AI receives** shows exactly what is sent.
|
|
152
|
+
|
|
153
|
+
**Company icons:** for applications made from a job link, TailorbirdCV fetches the company's icon once, from the company's own website. Turn this off in **Settings → Applications**.
|
|
154
|
+
|
|
155
|
+
### Backup and restore
|
|
156
|
+
Everything lives only on your computer, so keep a backup: **Settings → Backup & restore → Download backup** saves it all as one `.zip`. Restore it on any computer from the same page, or from the setup wizard's first page. Restoring never deletes anything: the data it replaces is kept in a `before-restore` folder. From a terminal: `tailorbirdcv backup [file]` and `tailorbirdcv restore <file>`.
|
|
157
|
+
|
|
158
|
+
> [!WARNING]
|
|
159
|
+
> **A backup isn't encrypted.** Anyone with the file can read your CV, contact details and applications, and use your API keys if you chose to include them (they're left out unless you tick **Include my API keys**). Keep it somewhere private and don't share it.
|
|
160
|
+
|
|
161
|
+
## If something goes wrong
|
|
162
|
+
| What you see | What to do |
|
|
163
|
+
|---|---|
|
|
164
|
+
| `command not found: tailorbirdcv`, or *tailorbirdcv is not recognized* | Open a new Terminal or PowerShell window. Still not found? Run `uv tool update-shell`, then open another new window. |
|
|
165
|
+
| *TailorbirdCV is running. Stop it first* | Press Ctrl+C in the window where TailorbirdCV runs (or close it), then run the installer again. |
|
|
166
|
+
| *Port 8000 is already in use* | TailorbirdCV is already running: use the link in its window, or start another copy with `tailorbirdcv serve --port 8001`. |
|
|
167
|
+
| *Running scripts is disabled on this system* (Windows) | Use the `irm … \| iex` line above instead of a downloaded `install.ps1` file. |
|
|
168
|
+
| *Don't run this with sudo* (macOS, Linux) | Run the install line again without `sudo`: TailorbirdCV installs for your user only. |
|
|
169
|
+
| Downloads fail or time out | Your network may block astral.sh, GitHub or PyPI. Try another network, or ask your IT team to allow them. |
|
|
170
|
+
| Anything else | Run `tailorbirdcv doctor`: it checks your AI, PDF engine and fonts, and says how to fix what's missing. |
|
|
171
|
+
|
|
172
|
+
## For developers
|
|
173
|
+
To run TailorbirdCV from a copy of this repository you'll also need [Node.js](https://nodejs.org/), to build the interface once:
|
|
174
|
+
```bash
|
|
175
|
+
uv sync
|
|
176
|
+
npm --prefix web install && npm --prefix web run build
|
|
177
|
+
uv run tailorbirdcv serve
|
|
178
|
+
```
|
|
179
|
+
A copy of the repository keeps your data in its `private/` folder (never committed). To use any other folder, set `TAILORBIRDCV_PRIVATE` to its path.
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
uv run pytest # tests
|
|
183
|
+
npm --prefix web run dev # interface with live reload (port 5173)
|
|
184
|
+
TAILORBIRDCV_ENGINE=fake uv run tailorbirdcv serve --port 8001 # demo mode, no AI calls
|
|
185
|
+
```
|
|
186
|
+
To release a new version: change the number in [VERSION](https://github.com/atenreiro/tailorbirdcv/blob/main/VERSION) (and add a CHANGELOG entry), then push to `main` (automatic releases are on once the repository variable `RELEASES_ENABLED` is `true`). Once CI passes, the release workflow publishes that version to PyPI and tags it, and installed copies offer the upgrade within a day.
|
|
187
|
+
|
|
188
|
+
The rules TailorbirdCV follows and how the code is laid out are described in [CLAUDE.md](https://github.com/atenreiro/tailorbirdcv/blob/main/CLAUDE.md). Changes are listed in [CHANGELOG.md](https://github.com/atenreiro/tailorbirdcv/blob/main/CHANGELOG.md).
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
<p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/atenreiro/tailorbirdcv/v0.2.0/docs/logo-dark.png"><img src="https://raw.githubusercontent.com/atenreiro/tailorbirdcv/v0.2.0/docs/logo.png" alt="TailorbirdCV" width="420"></picture></p>
|
|
2
|
+
|
|
3
|
+
# TailorbirdCV
|
|
4
|
+
|
|
5
|
+
**Tailor your resume to each job, without inventing anything.**
|
|
6
|
+
|
|
7
|
+
Give TailorbirdCV your CV once. Then, for each job, paste the posting's link. TailorbirdCV:
|
|
8
|
+
- works out what the role cares about;
|
|
9
|
+
- asks you about anything the job wants that your CV doesn't show;
|
|
10
|
+
- writes a tailored resume from your real experience (and a cover letter, if you want one);
|
|
11
|
+
- builds a Word document and a PDF, ready to send.
|
|
12
|
+
|
|
13
|
+
A built-in fact-check makes sure every line comes from your own CV: no made-up numbers, tools, employers or claims. Your name, employers, job titles, dates and education are copied exactly.
|
|
14
|
+
|
|
15
|
+
TailorbirdCV runs on your own computer (macOS, Windows or Linux) and opens in your browser. The writing is done by the AI you choose.
|
|
16
|
+
|
|
17
|
+

|
|
18
|
+
|
|
19
|
+
## How it works
|
|
20
|
+
<picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/atenreiro/tailorbirdcv/v0.2.0/docs/how-it-works-dark.png"><img src="https://raw.githubusercontent.com/atenreiro/tailorbirdcv/v0.2.0/docs/how-it-works.png" alt="How TailorbirdCV works. You give it your CV once, then a job posting and your answers to its questions. On your computer, TailorbirdCV keeps your master profile (the only source of facts), reads the job, asks about gaps, writes a draft, fact-checks every line against your profile and builds a Word document and PDF of your tailored resume and cover letter. The AI you choose (Claude or ChatGPT with your subscription, or an API key from Anthropic, OpenAI or OpenRouter) sees only the job and your CV's content; Privacy mode (optional and experimental) replaces your name, email, phone and links with placeholders before anything is sent."></picture>
|
|
21
|
+
|
|
22
|
+
Everything except the AI runs on your computer. Your CV becomes your **master profile**, the only place facts come from. The AI reads the job and writes the draft; TailorbirdCV checks every line against your profile before you see it.
|
|
23
|
+
|
|
24
|
+
## What you need
|
|
25
|
+
1. **An AI**, any one of:
|
|
26
|
+
- a **Claude** subscription, with [Claude Code](https://claude.com/claude-code) installed and logged in. No extra cost;
|
|
27
|
+
- a **ChatGPT** subscription, with [Codex](https://github.com/openai/codex) installed and logged in. No extra cost;
|
|
28
|
+
- an **API key** from [Anthropic](https://console.anthropic.com/), [OpenAI](https://platform.openai.com/) or [OpenRouter](https://openrouter.ai/), paid per use. It's kept in your computer's keychain.
|
|
29
|
+
2. **Something to make PDFs**: Microsoft Word, or the free [LibreOffice](https://www.libreoffice.org/). Without either, you still get the Word document.
|
|
30
|
+
|
|
31
|
+
Not sure what you have? Install TailorbirdCV first: its setup wizard checks and shows how to add anything missing.
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
**macOS or Linux:** open **Terminal**, paste this line and press Return:
|
|
35
|
+
```bash
|
|
36
|
+
curl -LsSf https://raw.githubusercontent.com/atenreiro/tailorbirdcv/main/install.sh | sh
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Windows:** open **PowerShell** (a normal window, not as administrator), paste this line and press Enter:
|
|
40
|
+
```powershell
|
|
41
|
+
irm https://raw.githubusercontent.com/atenreiro/tailorbirdcv/main/install.ps1 | iex
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
After a minute or two, TailorbirdCV opens in your browser. Keep the Terminal or PowerShell window open while you use it.
|
|
45
|
+
|
|
46
|
+
<details>
|
|
47
|
+
<summary>What the installer does</summary>
|
|
48
|
+
|
|
49
|
+
The scripts are short enough to read first: [install.sh](https://github.com/atenreiro/tailorbirdcv/blob/main/install.sh) and [install.ps1](https://github.com/atenreiro/tailorbirdcv/blob/main/install.ps1). They:
|
|
50
|
+
- install [uv](https://docs.astral.sh/uv/) (Astral's open-source Python installer) if you don't have it;
|
|
51
|
+
- install TailorbirdCV from PyPI in its own environment, with its own Python 3.13. Any Python already on your computer is left alone;
|
|
52
|
+
- add the `tailorbirdcv` command and start it.
|
|
53
|
+
|
|
54
|
+
They need no administrator rights, write only inside your user folder, and use your computer's own certificates, so they also work on company networks that inspect HTTPS.
|
|
55
|
+
|
|
56
|
+
Prefer to do it yourself? Install uv (`brew install uv`, `winget install astral-sh.uv`, or [another way](https://docs.astral.sh/uv/getting-started/installation/)), open a new terminal, then run `uv tool install --python 3.13 tailorbirdcv` and `tailorbirdcv serve`.
|
|
57
|
+
</details>
|
|
58
|
+
|
|
59
|
+
## Start, stop and update
|
|
60
|
+
- **Start:** run `tailorbirdcv serve` in Terminal or PowerShell. Your browser opens TailorbirdCV through a private link (also printed in the terminal) that unlocks it in that browser only.
|
|
61
|
+
- **Stop:** press **Ctrl+C** in that window, or close it.
|
|
62
|
+
- **Update:** when a new version is out, TailorbirdCV says so at the top of the page. Click **Upgrade** and it restarts by itself. To know, it asks PyPI for the latest version number at most once a day; nothing about you is sent. You can turn this off in **Settings → About TailorbirdCV**.
|
|
63
|
+
- **Check your setup:** `tailorbirdcv doctor`.
|
|
64
|
+
|
|
65
|
+
<details>
|
|
66
|
+
<summary>Uninstall</summary>
|
|
67
|
+
|
|
68
|
+
Stop TailorbirdCV, then run:
|
|
69
|
+
- macOS or Linux:
|
|
70
|
+
```bash
|
|
71
|
+
curl -LsSf https://raw.githubusercontent.com/atenreiro/tailorbirdcv/main/install.sh | sh -s -- --uninstall
|
|
72
|
+
```
|
|
73
|
+
- Windows:
|
|
74
|
+
```powershell
|
|
75
|
+
$env:TAILORBIRDCV_UNINSTALL = "1"; irm https://raw.githubusercontent.com/atenreiro/tailorbirdcv/main/install.ps1 | iex
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`uv tool uninstall tailorbirdcv` does the same. Your profile and applications stay in your [data folder](#your-data-and-privacy) until you delete it. uv stays installed; [Astral explains how to remove it](https://docs.astral.sh/uv/getting-started/installation/#uninstallation).
|
|
79
|
+
</details>
|
|
80
|
+
|
|
81
|
+
## First run
|
|
82
|
+
A short setup wizard (about 5 minutes) checks your computer, connects your AI, reads your CV, then asks about your targets (field, seniority, region, spelling, page limit) and a design (Classic, Modern or Compact).
|
|
83
|
+
|
|
84
|
+
Your CV is copied word for word, never rewritten. Nothing is saved until you've checked it: any line that doesn't match your file exactly is highlighted for you to fix or confirm.
|
|
85
|
+
|
|
86
|
+
Moving from another computer? Choose **Restore from a backup** on the wizard's first page.
|
|
87
|
+
|
|
88
|
+

|
|
89
|
+
|
|
90
|
+
## Tailoring a resume
|
|
91
|
+
1. Click **New tailoring** and paste the job posting's link (or its text).
|
|
92
|
+
2. **Brief:** see what the role wants and how your experience matches.
|
|
93
|
+
3. **Gaps:** answer questions about what the job wants and your profile doesn't show. No experience? Say so: it stays a gap.
|
|
94
|
+
4. **Review:** read the draft, click any line to edit it, and optionally ask for a hiring-manager review.
|
|
95
|
+
5. **Cover letter** (optional): one page in the same design, in a Formal, Warm or Direct tone, checked sentence by sentence like your resume.
|
|
96
|
+
6. **Export:** build the Word document and PDF. Too long? **Trim with AI**. Room to spare? **Fill the page with AI**. Both show their suggestions in Review before anything changes.
|
|
97
|
+
|
|
98
|
+
Then track it under **Applications**. Marking an application *applied* keeps a read-only copy of exactly what you sent. Found one of your resumes and not sure which version it is? **Identify a PDF** tells you which application it came from.
|
|
99
|
+
|
|
100
|
+

|
|
101
|
+
|
|
102
|
+

|
|
103
|
+
|
|
104
|
+
The screenshots use a fictional profile and job posting.
|
|
105
|
+
|
|
106
|
+
## Your data and privacy
|
|
107
|
+
> [!IMPORTANT]
|
|
108
|
+
> **The only thing that leaves your computer is what the AI needs to read your CV and the job, and to write the resume.**
|
|
109
|
+
|
|
110
|
+
There's no account, no server and no tracking. Your profile, applications and settings are kept in:
|
|
111
|
+
- macOS: `~/Library/Application Support/TailorbirdCV`
|
|
112
|
+
- Windows: `%LOCALAPPDATA%\TailorbirdCV`
|
|
113
|
+
- Linux: `~/.local/share/TailorbirdCV`
|
|
114
|
+
|
|
115
|
+
**Privacy mode** (on by default, **experimental**): your name, email, phone, address and personal links are replaced with placeholders like `[NAME]` before anything is sent to the AI, and put back afterwards, so your resume still shows them. Your career history is still sent and can identify you, and an unusual spelling can slip through, so use it with care. **Settings → Privacy → See what the AI receives** shows exactly what is sent.
|
|
116
|
+
|
|
117
|
+
**Company icons:** for applications made from a job link, TailorbirdCV fetches the company's icon once, from the company's own website. Turn this off in **Settings → Applications**.
|
|
118
|
+
|
|
119
|
+
### Backup and restore
|
|
120
|
+
Everything lives only on your computer, so keep a backup: **Settings → Backup & restore → Download backup** saves it all as one `.zip`. Restore it on any computer from the same page, or from the setup wizard's first page. Restoring never deletes anything: the data it replaces is kept in a `before-restore` folder. From a terminal: `tailorbirdcv backup [file]` and `tailorbirdcv restore <file>`.
|
|
121
|
+
|
|
122
|
+
> [!WARNING]
|
|
123
|
+
> **A backup isn't encrypted.** Anyone with the file can read your CV, contact details and applications, and use your API keys if you chose to include them (they're left out unless you tick **Include my API keys**). Keep it somewhere private and don't share it.
|
|
124
|
+
|
|
125
|
+
## If something goes wrong
|
|
126
|
+
| What you see | What to do |
|
|
127
|
+
|---|---|
|
|
128
|
+
| `command not found: tailorbirdcv`, or *tailorbirdcv is not recognized* | Open a new Terminal or PowerShell window. Still not found? Run `uv tool update-shell`, then open another new window. |
|
|
129
|
+
| *TailorbirdCV is running. Stop it first* | Press Ctrl+C in the window where TailorbirdCV runs (or close it), then run the installer again. |
|
|
130
|
+
| *Port 8000 is already in use* | TailorbirdCV is already running: use the link in its window, or start another copy with `tailorbirdcv serve --port 8001`. |
|
|
131
|
+
| *Running scripts is disabled on this system* (Windows) | Use the `irm … \| iex` line above instead of a downloaded `install.ps1` file. |
|
|
132
|
+
| *Don't run this with sudo* (macOS, Linux) | Run the install line again without `sudo`: TailorbirdCV installs for your user only. |
|
|
133
|
+
| Downloads fail or time out | Your network may block astral.sh, GitHub or PyPI. Try another network, or ask your IT team to allow them. |
|
|
134
|
+
| Anything else | Run `tailorbirdcv doctor`: it checks your AI, PDF engine and fonts, and says how to fix what's missing. |
|
|
135
|
+
|
|
136
|
+
## For developers
|
|
137
|
+
To run TailorbirdCV from a copy of this repository you'll also need [Node.js](https://nodejs.org/), to build the interface once:
|
|
138
|
+
```bash
|
|
139
|
+
uv sync
|
|
140
|
+
npm --prefix web install && npm --prefix web run build
|
|
141
|
+
uv run tailorbirdcv serve
|
|
142
|
+
```
|
|
143
|
+
A copy of the repository keeps your data in its `private/` folder (never committed). To use any other folder, set `TAILORBIRDCV_PRIVATE` to its path.
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
uv run pytest # tests
|
|
147
|
+
npm --prefix web run dev # interface with live reload (port 5173)
|
|
148
|
+
TAILORBIRDCV_ENGINE=fake uv run tailorbirdcv serve --port 8001 # demo mode, no AI calls
|
|
149
|
+
```
|
|
150
|
+
To release a new version: change the number in [VERSION](https://github.com/atenreiro/tailorbirdcv/blob/main/VERSION) (and add a CHANGELOG entry), then push to `main` (automatic releases are on once the repository variable `RELEASES_ENABLED` is `true`). Once CI passes, the release workflow publishes that version to PyPI and tags it, and installed copies offer the upgrade within a day.
|
|
151
|
+
|
|
152
|
+
The rules TailorbirdCV follows and how the code is laid out are described in [CLAUDE.md](https://github.com/atenreiro/tailorbirdcv/blob/main/CLAUDE.md). Changes are listed in [CHANGELOG.md](https://github.com/atenreiro/tailorbirdcv/blob/main/CHANGELOG.md).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.2.0
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Hatch build hook: ship the built web UI inside the wheel, so users don't need Node.
|
|
2
|
+
|
|
3
|
+
`npm --prefix web ci && npm --prefix web run build` must run before `uv build` (the release
|
|
4
|
+
workflow does). Editable/dev installs serve web/dist straight from the checkout instead.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from hatchling.builders.hooks.plugin.interface import BuildHookInterface
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CustomBuildHook(BuildHookInterface):
|
|
13
|
+
def initialize(self, version, build_data):
|
|
14
|
+
if self.target_name != "wheel" or version == "editable":
|
|
15
|
+
return
|
|
16
|
+
dist = Path(self.root) / "web" / "dist"
|
|
17
|
+
if not (dist / "index.html").is_file():
|
|
18
|
+
raise RuntimeError("web/dist is missing: run `npm --prefix web ci && npm --prefix web run build` first")
|
|
19
|
+
build_data["force_include"][str(dist)] = "tailorbirdcv/web"
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "tailorbirdcv"
|
|
3
|
+
dynamic = ["version"] # from the VERSION file: bump it on main and CI releases it (see release.yml)
|
|
4
|
+
description = "Tailor your resume to a job description without inventing anything — a local web app"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.11"
|
|
7
|
+
keywords = ["resume", "cv", "job application", "ats", "claude", "openai", "openrouter"]
|
|
8
|
+
classifiers = [
|
|
9
|
+
"Development Status :: 4 - Beta",
|
|
10
|
+
"Environment :: Web Environment",
|
|
11
|
+
"Intended Audience :: End Users/Desktop",
|
|
12
|
+
"Operating System :: MacOS",
|
|
13
|
+
"Operating System :: Microsoft :: Windows",
|
|
14
|
+
"Operating System :: POSIX :: Linux",
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3.11",
|
|
17
|
+
"Programming Language :: Python :: 3.12",
|
|
18
|
+
"Programming Language :: Python :: 3.13",
|
|
19
|
+
"Topic :: Office/Business",
|
|
20
|
+
]
|
|
21
|
+
dependencies = [
|
|
22
|
+
"python-docx>=1.1",
|
|
23
|
+
"pyyaml>=6.0",
|
|
24
|
+
"pydantic>=2.6",
|
|
25
|
+
"pypdf>=4.0",
|
|
26
|
+
"fastapi>=0.115",
|
|
27
|
+
"uvicorn>=0.30",
|
|
28
|
+
"httpx>=0.27",
|
|
29
|
+
"beautifulsoup4>=4.12",
|
|
30
|
+
"playwright>=1.48",
|
|
31
|
+
"platformdirs>=4.0",
|
|
32
|
+
"anthropic>=1.11", # messages.create(output_config=…) structured outputs, as tested
|
|
33
|
+
"keyring>=25",
|
|
34
|
+
"openai>=3.24", # Responses API with strict json_schema, as tested
|
|
35
|
+
"truststore>=0.10", # update checks trust the OS certificates (company proxies that inspect HTTPS)
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
[project.scripts]
|
|
39
|
+
tailorbirdcv = "tailorbirdcv.cli:main" # also what `uvx tailorbirdcv` runs
|
|
40
|
+
|
|
41
|
+
[project.urls]
|
|
42
|
+
Homepage = "https://github.com/atenreiro/tailorbirdcv"
|
|
43
|
+
Changelog = "https://github.com/atenreiro/tailorbirdcv/blob/main/CHANGELOG.md"
|
|
44
|
+
Issues = "https://github.com/atenreiro/tailorbirdcv/issues"
|
|
45
|
+
|
|
46
|
+
[dependency-groups]
|
|
47
|
+
dev = ["pytest>=8"]
|
|
48
|
+
|
|
49
|
+
[build-system]
|
|
50
|
+
requires = ["hatchling"]
|
|
51
|
+
build-backend = "hatchling.build"
|
|
52
|
+
|
|
53
|
+
[tool.hatch.version]
|
|
54
|
+
path = "VERSION"
|
|
55
|
+
pattern = '^(?P<version>\d+\.\d+\.\d+)\s*$'
|
|
56
|
+
|
|
57
|
+
[tool.hatch.build.targets.wheel]
|
|
58
|
+
packages = ["tailorbirdcv"]
|
|
59
|
+
|
|
60
|
+
[tool.hatch.build.targets.wheel.hooks.custom]
|
|
61
|
+
path = "hatch_build.py" # bundles the built web UI (web/dist) as tailorbirdcv/web
|
|
62
|
+
|
|
63
|
+
[tool.hatch.build.targets.sdist]
|
|
64
|
+
include = ["/tailorbirdcv", "/web/dist", "/README.md", "/CHANGELOG.md", "/hatch_build.py", "/VERSION"] # anchored: nothing from node_modules or worktrees
|
|
65
|
+
artifacts = ["/web/dist/**"] # git-ignored, but the wheel built from the sdist needs it
|
|
66
|
+
|
|
67
|
+
[tool.uv]
|
|
68
|
+
cache-keys = [{ file = "pyproject.toml" }, { file = "VERSION" }] # a VERSION bump refreshes the editable install's version
|
|
69
|
+
|
|
70
|
+
[tool.pytest.ini_options]
|
|
71
|
+
testpaths = ["tests"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""TailorbirdCV — tailor a fact-locked master resume to a job description."""
|