Kitty has a job skill
A Claude skill that scores job postings, tailors your CV, keeps an application tracker and syncs statuses from email.
- 52 ★ on the repository
- Last commit
- MIT
Broad access
Why this level
- The skill handles CV personal data and reads Gmail through a connector for application statuses.
- The tracker lives in Notion or local files and holds details about employers and interviews.
Install
- Works in
In your terminal, with SkillFoxx CLI
npx skillfoxx add skills/kitty-has-a-jobDetects the agents on your machine, shows the access level and pins the version.
Other ways to install
Access and checks
How we reviewBroad accessThe tool can change data, run commands or handle secrets.
- The skill handles CV personal data and reads Gmail through a connector for application statuses.
- The tracker lives in Notion or local files and holds details about employers and interviews.
This is third-party code. Review the repository files before installing.
What it does
You send a job posting link and Kitty scores the fit and says whether to apply. The fit card shows role level, domain, covered must-haves, logistics and the salary band against your target. Over time scoring takes your interview results into account. Then the skill tailors the CV: it reads your `.docx` template, matches your experience to the posting, proposes changes by section with explicit cuts and edits nothing until you agree. Every application goes into a tracker: in Notion or, without it, in local `tracker.csv` and `kitty-settings.md` files. Through the Gmail connector the skill updates application statuses on a schedule. A report shows how many interviews you get at each stage, where the funnel dips and which roles convert better. The skill never invents facts: missing metrics are asked of you.
Who it is for. Job seekers tired of sending CVs with no reply who want order in applications, edits per posting and an honest picture of the funnel.
Good fit when
- Before applying you want to know from a fit card whether the time is worth it.
- The CV must be adapted to the wording of a posting without changing the template or growing the page count.
- You already have dozens of applications and the tracker must show where you have written.
- You want to see by stage where interview invitations are lost.
Not a fit when
- You need ATS guarantees: the skill follows common practice and flags layout risks, but every parser differs.
- The CV is not stored as `.docx`: other formats are not supported yet.
- You need it in another agent: the skill is tested only in Claude.
Example request
Here is a job description. Score the fit, propose CV edits by section and mark which posting terms I cannot back up.Limitations
The skill is tested in Claude Cowork and Claude Code, not in other environments such as Codex. It needs Python 3 with the `python-docx`, `pypdf` and `lxml` packages and LibreOffice (`soffice`) for page counts. The CV must be `.docx`. The skill cannot open LinkedIn links because the site blocks automated readers, so paste the posting text by hand. Notion and Gmail are connected as connectors in Claude settings, without Notion the tracker lives in local files, and status sync always needs Gmail. The skill does not promise a guaranteed ATS pass.
How to disable. Delete the `~/.claude/skills/kitty-has-a-job/` folder, and in Claude Cowork remove the uploaded skill. The application tracker in Notion or `tracker.csv` and the Notion and Gmail connectors are disconnected separately.
FAQ
How do I install the skill?
Download `dist/kitty-has-a-job.zip` from the repository. In Claude Code unzip it into `~/.claude/skills/` so you get `~/.claude/skills/kitty-has-a-job/`. In the Claude app or Cowork upload the zip as a skill.
How do I get started?
Say "hello kitty" or "set up Kitty has a job". Claude creates a tracker and a settings page and asks about targets, locations, page limit, guardrails and sync schedule. After that just share a posting link.
Does the skill change my CV without asking?
No. It reads a copy of the template and shows the full list of changes by section, with any posting term your CV does not support marked as a new claim. Changes go into a new file and the template stays as is.
Where is my data stored?
CV files stay in your folder, and the tracker and settings live in your Notion or local files. Data goes only through Claude and the connectors you switch on, that is Notion and Gmail.
Is there a sample to try?
Yes, `examples/sample_cv.docx`: a made-up two-page CV of a product manager. Set the page limit to 2 when trying it. Use your own CV for real applications.
Discussion
No questions or reviews yet.
Related
SkillsA Claude Code kit: a skill scores a job posting, a builder makes CVs and letters, and a daily scanner looks for new ads.
Job search inside your coding agent: scores each listing against your CV from 1 to 5, tailors a PDF resume, drafts letters and tracks applications
A skill set for resumes and job search: tailoring to a vacancy, ATS pass-through checks, cover letters and interview preparation
Resume Optimizer audits a resume against a problem checklist, turns duties into results and fits it to one page for a target job.
A job-hunt skill bundle: JD decoding, template resumes, behavioral interview prep, offer comparison and negotiation
Plugin for Codex and Claude Code that fills job applications in a visible browser from your resume and stops before submit
README in short
The README explains how the skill scores a posting, edits the CV, keeps a tracker and reads statuses from email. It covers the tenets (authenticity, good citizenship, privacy, honesty), a one-bullet edit example, quick start, dependencies, a local mode without Notion and the internals.
README badge
Original SKILL.md
--- name: kitty-has-a-job description: Job search copilot that scores a posting for fit, tailors the user's .docx CV according to best practices, logs applications in a tracker (Notion or local CSV), syncs statuses from Gmail, reports funnel stats. Use when the user shares a job posting, asks "should I apply", to tailor their CV, for application stats, to set up or sync their tracker, says "hello kitty" (starts setup), or asks for a cat fact. Not for cover letters, interview prep, salary negotiation or career advice. metadata: version: '1.0.0' --- # Kitty has a job Needs Python 3 (`pip install python-docx pypdf lxml`) and LibreOffice (`soffice`) for page counts; never assume they are installed. Scripts (`cv.py`, `tracker.py`, `stats.py`) are in `scripts/` in this skill's folder: run them, don't read them (`--help` shows usage and exit codes). ## Modes | Mode | When | Do | |---|---|---| | Setup | No settings found, "hello kitty", or "set up / change my Kitty settings" | Read `references/setup.md` and `references/common.md` | | Score | "Should I apply?", "score this role" | Steps 0 to 3 | | Tailor | A posting plus "tailor my CV" / "apply" | Steps 0 to 3, then `references/tailor.md` | | Stats | "Give stats", "how are my applications going" | Step 0, then `references/stats.md` | | Sync | "Sync my applications", or the scheduled task | Step 0, then `references/sync.md` | | Cheer up | "Cat fact", "cheer me up" | Reply with the cat fact rules below; no settings or tracker needed | ## Steps | # | Step | Use | On failure | |---|---|---|---| | 0.1 | Find settings: Notion page "Kitty Settings", else `kitty-settings.md` in the working folder or its direct subfolders (never this skill's or an `evals/` folder), else a file the user names | `Notion:notion-search` | None found: Setup. Several pages: use the user's own, else ask. Notion down: say so, use a local file if one exists | | 0.2 | Read every field; empty means not set | settings | Never guess a value; ask only if this mode needs it | | 0.3 | Read `references/common.md`, plus the tracker branch: `collection://...` → `references/tracker-notion.md`; a file path or `dry run` → `references/tracker-csv.md` | references | Tracker cannot be opened: tell the user, ask whether to reconnect or create one; never create silently | | 1 | Get the posting: LinkedIn via a logged-in browser (try once), other URLs via fetch, else search `"<title>" "<company>" job description` | browser, fetch, web search | Still nothing: ask the user to paste it. No link: one reminder line, carry on | | 2 | Extract title, company, city and country, level, hard requirements, salary band, URL | posting | Employer hidden by an agency: Company `Unknown (via <agency>)`. Posting closed: say so, no row | | 3 | Read the CV with `cv.py read <template>` (template from `settings.template_rules`, else the only or newest .docx), score with the rubric below, show the fit card | `scripts/cv.py` | Script cannot run: use `references/cv-editing.md` and say so | Several postings at once: one short card each, then tailor one at a time in the order the user picks. ## Fit card (use exactly) ``` **Fit: <n>/5, <apply / apply with an angle / skip>** - Role level: <match / stretch / mismatch>, <why> - Domain: <strong / adjacent / new>, <why> - Must-haves: <x of y covered>; missing: <list or none> - Logistics: <location, on-site days, language, visa, or none> - Salary: <published band | "estimate: ... (source)" | "unknown (no published band, no reliable data)"> vs settings.compensation_target - Link: <url | missing, add it when you have it>