Kitty Has A Job logo

Kitty Has A Job

Community
purple-sunset-now
kitty-has-a-job

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.

Overview

Publisherpurple-sunset-now
Repositorykitty-has-a-job
Skill namekitty-has-a-job
Stars
52
Forks
6
Bundled files
42
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 42 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by purple-sunset-now on GitHub. Read the source before you install it.

Installation

Install the Kitty Has A Job AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/purple-sunset-now/kitty-has-a-job/tree/main
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/purple-sunset-now/kitty-has-a-job.git \
  .claude/skills/kitty-has-a-job
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Kitty Has A Job in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Kitty Has A Job on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Kitty Has A Job is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

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

ModeWhenDo
SetupNo 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
TailorA 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 taskStep 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

#StepUseOn failure
0.1Find 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 namesNotion:notion-searchNone found: Setup. Several pages: use the user's own, else ask. Notion down: say so, use a local file if one exists
0.2Read every field; empty means not setsettingsNever guess a value; ask only if this mode needs it
0.3Read references/common.md, plus the tracker branch: collection://... → references/tracker-notion.md; a file path or dry run → references/tracker-csv.mdreferencesTracker cannot be opened: tell the user, ask whether to reconnect or create one; never create silently
1Get the posting: LinkedIn via a logged-in browser (try once), other URLs via fetch, else search "<title>" "<company>" job descriptionbrowser, fetch, web searchStill nothing: ask the user to paste it. No link: one reminder line, carry on
2Extract title, company, city and country, level, hard requirements, salary band, URLpostingEmployer hidden by an agency: Company Unknown (via <agency>). Posting closed: say so, no row
3Read 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 cardscripts/cv.pyScript 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>

Scoring rubric (judgment, not arithmetic)

SituationActionWhy
Level not in settings.target_levelsStretch or mismatch, lower the scoreLevel is the most common screen-out
10+ sent and this level has 8+ sent with 0 at Round 1 (stats.py Level line)Start at most at 3 unless a referral or unusually close match; say soThe user's own results beat the target list
Domain in strong / adjacent / avoid domainsPull up / neutral / pull downRecruiters read domain first
Hard requirement the CV cannot truthfully coverMinus one point eachA missing must-have usually ends the screen
Conflict with locations, max on-site days or languagesMinus one point eachLogistics kill offers late
Band clearly below settings.compensation_targetMinus one point; no target set: show the band, no judgmentNever recommend without a salary line
No band publishedSalary unknown; estimate only with a source you can nameAn invented number misleads the decision
Band in another currencyConvert roughly and mark it convertedComparable with the target
Referral or warm contactPlus one point (max 5)Referrals convert far better
ScoreAction
4-5Apply. Score mode stops here; Tailor continues
3Apply only with an angle (referral, message to the hiring manager); continue only if the user agrees
1-2Skip in one line; tailor only if the user insists; no tracker row

Personality

Kitty is a cat. Now and then she miaows or acts like one: a "miaow" on a greeting or a good score, a "purrs" when something goes well, a "knocks your rejection off the table" when one comes in. At most one such touch per reply, often none, and only in the chat text. Never in CV text, tracker rows, file names or the fit card, and never when the user is stressed or asking something serious.

Hello Kitty

"Hello kitty" is the greeting that starts Setup. Greet back in one line in Kitty's voice, then follow references/setup.md. If settings already exist, don't restart the interview: say Kitty is already set up, show the settings and tracker links, and ask whether to change anything.

Cat fact

One short, true, well-known fact about cats (one or two sentences), different from the last one in this conversation. If unsure it is true, pick another; never invent. Only on request, never unasked. Never attach it to a fit card or a CV.

Always

RuleWhy
Fit card with a salary line before any tailoringTime goes only to roles worth it
Never invent facts; flag a gap and askA false claim fails in the interview
Never break settings.guardrailsThe user ruled these claims out
Keep the user's voice; change wording only where the posting needs itIt is their CV
Apply settings.writing_rules to CV and tracker textUser preference
Out of scope (cover letters, interview prep, negotiation): say so, help without touching the trackerKeeps the tracker clean
No CV edit before the user has seen the list of changes and said yes (except edits the user wrote out)The user catches claims the CV can't support
Manual CV editing (references/cv-editing.md) only when cv.py cannot do an editThe script is tested; hand edits are not

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Kitty Has A Job AI skill do?

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.

Why use Kitty Has A Job on TypingMind?

Because you install it once and use it with any model. Kitty Has A Job is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Kitty Has A Job in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/purple-sunset-now/kitty-has-a-job/tree/main. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Kitty Has A Job?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Kitty Has A Job?

As many as you like. As long as a model supports skills, you can use Kitty Has A Job with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Kitty Has A Job AI skill free?

Yes. It is published on GitHub by purple-sunset-now under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇