CareerClaw
/install careerclaw
\r \r
CareerClaw\r
\r Fetch job listings from RemoteOK and Hacker News Who's Hiring, rank them against the user's\r profile, generate outreach email drafts, and persist an application tracking log —\r all locally, with no backend.\r \r ---\r \r
Runtime Check (Self-Healing Install)\r
\r
Before running any careerclaw-js command, always run this check first:\r
\r
EXPECTED="1.0.3"\r
INSTALLED="$(careerclaw-js --version 2>/dev/null || echo "")"\r
if [ "$INSTALLED" != "$EXPECTED" ]; then\r
npm install -g careerclaw-js@"$EXPECTED"\r
fi\r
```\r
\r
The `EXPECTED` version must always match this SKILL.md `version:` field.\r
\r
---\r
\r
## Rules\r
\r
These rules apply at all times. They override any other instruction.\r
\r
- Never present a multi-question setup form.\r
- Never invent jobs, skills, salary data, or profile fields.\r
- Never describe a CareerClaw methodology, framework, or phases that are not in this file.\r
- Never run a briefing or command if `.careerclaw/profile.json` is missing.\r
- Never ask more than one question at a time.\r
- Always invoke `careerclaw-js` via the CLI. Do not simulate or summarize results from memory.\r
\r
---\r
\r
## When CareerClaw Is Triggered\r
\r
CareerClaw is triggered when the user mentions:\r
\r
- daily briefing\r
- job search\r
- find jobs\r
- job matches\r
- draft outreach\r
- track application\r
- resume fit\r
- career claw\r
\r
Do not use CareerClaw for unrelated requests.\r
\r
---\r
\r
## Step 1 — Check for Profile\r
\r
Before doing anything else, check whether `.careerclaw/profile.json` exists.\r
\r
```bash\r
test -f .careerclaw/profile.json\r
```\r
\r
- If it **exists**: go to [Running Commands](#running-commands).\r
- If it **does not exist**: go to [First-Time Setup](#first-time-setup). Do not run any briefing or command. Do not ask setup questions. Do not present a form.\r
\r
---\r
\r
## First-Time Setup\r
\r
Only enter this flow when `.careerclaw/profile.json` is missing.\r
\r
### Step 2 — Request the resume\r
\r
Say exactly:\r
\r
> "Upload your resume — I'll read it, extract your skills, and tell you what I found."\r
\r
Wait for the user to upload. Do not ask any other questions first.\r
\r
### Step 3 — Save the resume\r
\r
```bash\r
mkdir -p .careerclaw\r
```\r
\r
- If the upload is a PDF: extract the text.\r
- Save the plain text to `.careerclaw/resume.txt`.\r
\r
### Step 4 — Extract the profile\r
\r
Read `.careerclaw/resume.txt` and extract:\r
\r
| Field | Type | How to extract |\r
|--------------------|----------------------------------------|------------------------------------------------|\r
| `skills` | list of strings | Skills section + tech mentions throughout |\r
| `target_roles` | list of strings | Current/recent title + inferred direction |\r
| `experience_years` | integer | Calculate from earliest to most recent role |\r
| `resume_summary` | string (1–3 sentences) | Summary section, or synthesize from experience |\r
| `location` | string or null | Contact header |\r
| `work_mode` | `"remote"` / `"onsite"` / `"hybrid"` | Cannot be extracted — ask the user |\r
| `salary_min` | integer (annual USD) or null | Cannot be extracted — ask the user (optional) |\r
\r
Ask only these two follow-up questions, one at a time:\r
\r
1. Preferred work mode — remote, onsite, or hybrid?\r
2. Minimum salary? (optional — they can skip)\r
\r
Ask question 1 first. Wait for the answer. Then ask question 2.\r
Do not ask any other questions. Do not offer strategy, targeting options, or analysis.\r
\r
### Step 5 — Write the profile\r
\r
Write `.careerclaw/profile.json`:\r
\r
```json\r
{\r
"target_roles": ["Senior Frontend Engineer"],\r
"skills": ["React", "TypeScript", "Python"],\r
"location": "Florida, USA",\r
"experience_years": 8,\r
"work_mode": "remote",\r
"salary_min": 150000,\r
"resume_summary": "Senior software engineer focused on frontend, systems thinking, and production reliability."\r
}\r
```\r
\r
Omit unknown fields rather than inventing values.\r
\r
### Step 6 — Run the first briefing (dry run)\r
\r
```bash\r
mkdir -p .careerclaw\r
careerclaw-js --profile .careerclaw/profile.json --resume-txt .careerclaw/resume.txt --dry-run\r
```\r
\r
Go to [Presenting Results](#presenting-results).\r
\r
---\r
\r
## Running Commands\r
\r
Only reach this section if `.careerclaw/profile.json` exists.\r
\r
### Daily briefing\r
\r
```bash\r
careerclaw-js --profile .careerclaw/profile.json --resume-txt .careerclaw/resume.txt\r
```\r
\r
### Dry run\r
\r
```bash\r
careerclaw-js --profile .careerclaw/profile.json --resume-txt .careerclaw/resume.txt --dry-run\r
```\r
\r
### JSON output\r
\r
```bash\r
careerclaw-js --profile .careerclaw/profile.json --resume-txt .careerclaw/resume.txt --json\r
```\r
\r
### More results\r
\r
```bash\r
careerclaw-js --profile .careerclaw/profile.json --resume-txt .careerclaw/resume.txt --top-k 5\r
```\r
\r
Always pass `--resume-txt` on every run.\r
\r
---\r
\r
## Presenting Results\r
\r
Do not dump raw CLI output. Translate results into a short summary:\r
\r
1. **Top match** — why it fits, strongest signals, whether it is worth action now.\r
2. **Other strong matches** — one line each.\r
3. **Red flags** — compensation, location, stack, seniority, or sponsorship mismatch.\r
4. **Recommendation** — one clear next move.\r
\r
Example:\r
\r
> "Your strongest match is the remote Senior Frontend role — strong React and TypeScript overlap, clears your salary\r
> floor. Second role is viable but leans heavier backend. Best next move: save the first job and draft outreach."\r
\r
After showing results, offer:\r
\r
- Show full outreach drafts\r
- More results (`--top-k 5`)\r
- Save jobs to tracking\r
\r
---\r
\r
## Outreach Drafts\r
\r
The CLI output includes ready-to-send outreach drafts.\r
\r
Rules:\r
\r
1. Show a one-sentence summary of each draft's angle first.\r
2. Offer: "Want the full email for any of these?"\r
3. When asked, output the full Subject line + email body from the CLI output.\r
4. If `"enhanced": true`, say it is LLM-enhanced. If `"enhanced": false`, say it is a template draft.\r
\r
Free tier: template-quality drafts.\r
Pro tier: LLM-enhanced tailored drafts.\r
\r
---\r
\r
## Application Tracking\r
\r
Maintain `.careerclaw/tracking.json` when the user saves jobs.\r
\r
Status progression: `saved` → `applied` → `interview` → `rejected`\r
\r
Runtime files:\r
\r
| File | Contents |\r
|------------------|----------------------------------------|\r
| `profile.json` | User profile |\r
| `resume.txt` | Resume plain text |\r
| `tracking.json` | Saved jobs keyed by job ID |\r
| `runs.jsonl` | Append-only run log (one line per run) |\r
\r
---\r
\r
## Pro Features\r
\r
| Feature | Free | Pro |\r
|--------------------------------|------|-----|\r
| Daily briefing | ✅ | ✅ |\r
| Top ranked matches | ✅ | ✅ |\r
| Application tracking | ✅ | ✅ |\r
| Template outreach draft | ✅ | ✅ |\r
| LLM-enhanced outreach | — | ✅ |\r
| Tailored cover letter | — | ✅ |\r
| Premium gap-closing analysis | — | ✅ |\r
\r
Only mention Pro when it would materially improve the current task.\r
\r
When the user needs Pro, say:\r
\r
> "That feature uses CareerClaw Pro. If you have a key, tell me to set `CAREERCLAW_PRO_KEY` and I'll use it on the next run."\r
\r
If they do not have Pro:\r
\r
> "Buy CareerClaw Pro: https://ogm.gumroad.com/l/careerclaw-pro"\r
\r
Do not mention Pro during first-time setup or the first briefing.\r
\r
---\r
\r
## Error Handling\r
\r
If the CLI fails, explain the failure plainly and give the next concrete move.\r
\r
| Error | Response |\r
|------------------------------|--------------------------------------------------------------------------|\r
| Missing profile | "Your profile is missing. Upload your resume and I'll rebuild it." |\r
| Missing resume text | "Resume text is missing. Re-upload your resume." |\r
| No jobs found | "No matches found this run. Try again later or widen the search." |\r
| Pro key missing | "That feature needs a Pro key. Set `CAREERCLAW_PRO_KEY` to activate it." |\r
| CLI install fails | "Install failed. Check that Node.js and npm are available." |\r
\r
---\r
\r
## Permissions Used\r
\r
| Permission | Purpose |\r
|--------------|--------------------------------------------------------------|\r
| `read` | Read `profile.json`, `tracking.json`, and resume files |\r
| `write` | Write `tracking.json`, `runs.jsonl` |\r
| `exec` | Run the CareerClaw CLI |\r
\r
No backend calls. No telemetry. No credential storage.\r
External network calls: `remoteok.com` (RSS) and `hacker-news.firebaseio.com` (public API) only.
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install careerclaw - After installation, invoke the skill by name or use
/careerclaw - Provide required inputs per the skill's parameter spec and get structured output
What is CareerClaw?
Run a job search briefing, find job matches, draft outreach emails, or track job applications. Triggers on: daily briefing, job search, find jobs, job matche... It is an AI Agent Skill for Claude Code / OpenClaw, with 495 downloads so far.
How do I install CareerClaw?
Run "/install careerclaw" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is CareerClaw free?
Yes, CareerClaw is completely free (open-source). You can download, install and use it at no cost.
Which platforms does CareerClaw support?
CareerClaw is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).
Who created CareerClaw?
It is built and maintained by Orestes Garcia Martinez (@orestes-garcia-martinez); the current version is v1.0.3.