Install
openclaw skills install @chris-openclaw/job-search-trackerUse this skill when someone is actively managing a job search and references applications, interviews, offers, or recruiter communication. Specific triggers: 'I applied to [company],' 'just submitted an application,' 'track this job,' 'job search dashboard,' 'what jobs have I applied to,' 'any responses from [company] yet,' 'haven't heard back from [company],' 'prep me for the [company] interview,' 'draft a cover letter for [company/role],' 'write a follow-up email to [company/recruiter],' 'thank-you note for the [company] interview,' 'got rejected from [company],' 'got an offer from [company],' 'help me negotiate the [company] offer,' 'salary negotiation,' 'which resume should I send for [posting],' 'does this [draft] sound desperate or templated,' or any message that explicitly names a company in a hiring context. Do NOT trigger on general productivity questions, calendar requests, or unrelated email tasks. Covers: application tracking in a local markdown file, stale-application detection, follow-up and cover-letter drafting with tracker context, interview prep, salary negotiation analysis and counter-offer drafting, tone checks on user drafts, resume-variant recommendations, and optional Gmail/LinkedIn lookups (user-mediated, see Data Handling).
openclaw skills install @chris-openclaw/job-search-trackerA complete job search command center. Tracks every application from discovery to offer, integrates with Gmail and LinkedIn for context, flags stale applications that need follow-up, and helps draft cover letters, follow-up emails, and interview prep materials.
Job searching while juggling other responsibilities is chaotic. You apply to 30 places, lose track of which ones you followed up on, forget the recruiter's name, and can't remember which version of your resume you sent. This skill keeps it all in one place and does the busywork for you.
All application data lives in a single markdown file: applications.md in the current working directory (or wherever the user specifies). This file is the source of truth for the entire job search.
# Job Search Tracker
_Last updated: YYYY-MM-DD_
_Active applications: X | Interviews: X | Offers: X | Closed: X_
---
## [Company Name] - [Role Title]
- **Status**: [Applied | Screening | Interviewing | Final Round | Offer | Accepted | Rejected | Withdrawn | Ghosted]
- **Date Applied**: YYYY-MM-DD
- **Posting URL**: [link]
- **Salary Range**: [what's listed or discussed]
- **Resume Version**: [which resume was sent]
- **Cover Letter**: [yes/no, and which version or key angle used]
- **Source**: [LinkedIn Easy Apply | Company Site | Referral | Recruiter Outreach | Job Board]
### Contacts
- [Name] - [Title] (e.g., "Sarah Chen - Senior Recruiter") - [email if known]
- [Name] - [Title] - [email if known]
### Timeline
- YYYY-MM-DD: Applied via [source]
- YYYY-MM-DD: [Event - e.g., "Phone screen with Sarah Chen", "Received coding assessment", "Sent follow-up email"]
### Notes
[Freeform notes - anything relevant about the role, company, conversations, gut feelings, red flags, compensation details discussed]
### Follow-up
- **Next action**: [what needs to happen next]
- **Due by**: [date]
- **Last contact**: [date of most recent communication]
---
Each company gets its own section with the ## Company - Role header. Sections are ordered by status priority: active applications first (Interviewing > Screening > Applied), then closed ones (Offers > Accepted > Rejected > Withdrawn > Ghosted) at the bottom.
If applications.md doesn't exist when the user asks to track something, create it with the header and their first application. Don't make a big deal of setup; just start tracking.
When the user reports a status change ("I heard back from Stripe" or "got rejected from Google"), update the relevant section: change the status, add a timeline entry with today's date, and update the follow-up section. If they mention a new contact name, add it to Contacts.
This skill works best when Gmail access is available (via MCP tools, the Gmail skill, or IMAP). When email tools are available, use them. When they're not, work with whatever the user tells you manually.
When the user asks you to scan their email for applications (or when doing a periodic check-in):
subject:"application received" OR subject:"application confirmed" OR subject:"thank you for applying" OR subject:"we received your application"from:notifications@linkedin.com subject:"application"subject:"next steps" from:recruiting OR from:talent OR from:careersapplications.md to avoid duplicatesWhen the user asks about a specific company or the skill needs more context:
LinkedIn integration works through browser automation or the LinkedIn skill/MCP if available. Since LinkedIn access can be unreliable, design all features to work without it and treat LinkedIn data as a bonus layer.
When the user mentions applying through LinkedIn or asks to check their recent applications:
applications.mdWhen adding a new application or prepping for an interview:
If LinkedIn isn't accessible, fall back to web search for company research. The research should happen regardless; LinkedIn is just one source.
Many users keep multiple resume variants tailored to different job types (e.g., "engineering-focused," "leadership-focused," "generalist"). This skill can suggest the best variant for a given posting.
Resumes live in a resumes/ directory alongside applications.md. Each variant is a markdown or text file named for its slant:
resumes/
engineering-focused.md
leadership-focused.md
generalist.md
Each file should start with a one-paragraph self-description that summarizes the angle it takes. The skill reads these descriptions to make recommendations. It does not need the full resume content for matching, just the description block at the top.
When the user adds a new application, asks "which resume should I send?", or pastes a job posting:
resumes/Resume Version fieldIf no resumes/ directory exists, prompt the user once: "I don't see saved resume variants. Want to set up the resumes/ folder, or just track which version you sent each time?" Don't badger after the initial prompt; respect "no" the first time.
This is one of the most valuable features. Job seekers lose opportunities by not following up.
When the user opens their tracker or asks "what needs attention", scan all active applications and flag:
When the user asks for their job search status, dashboard, or overview, generate a summary:
# Job Search Dashboard
_As of YYYY-MM-DD_
## Needs Attention (X items)
- **[Company] - [Role]**: No response in 10 days. Consider following up.
- **[Company] - [Role]**: Interview tomorrow. Run interview prep?
- **[Company] - [Role]**: Follow-up was due 2 days ago.
## Pipeline Summary
- Actively interviewing: X
- Waiting to hear back: X
- Applied recently (< 7 days): X
- Total active: X
- Closed this month: X (Y rejected, Z withdrawn)
## Recent Activity
- [Date]: [Event summary]
- [Date]: [Event summary]
- [Date]: [Event summary]
## Stats
- Applications this week: X
- Response rate: X%
- Average time to first response: X days
The skill helps draft outreach materials tailored to each specific application. The key value here is that the skill has all the context from the tracker -- it knows what role the user applied for, who they've been talking to, and what's happened so far.
When the user asks for a cover letter:
When following up on an application or after an interview:
After an interview:
When the user pastes their own draft and asks for a check (or says "does this sound desperate," "is this templated," "does this sound okay"), run a quick tone pass before they send.
Flag categories
Output format
Tone read: [Tight | Mostly fine, some flags | Needs work]
Flags found:
1. [Category] — "[exact phrase from draft]" — why it lands flat
2. ...
Suggested revisions:
- "[phrase]" → "[better phrase]"
- ...
If the draft is already tight, say so directly: "Reads well. Nothing to fix. Ready to send."
Do not rewrite the entire draft unless the user asks. The goal is a targeted edit, not a full rewrite that erases their voice.
When the user has an upcoming interview or asks to prep for one:
Generate a one-page brief covering:
Based on the job posting:
Generate 8-10 likely interview questions:
For each question, provide a brief outline of a strong answer structure, not a full script. The user should sound like themselves, not like they memorized something.
When the user reports an offer (triggers like "got an offer," "they made me an offer," "offer letter came in," "they came in at X"), shift into negotiation support mode.
Based on tracker context:
If the user wants help responding:
"I just applied to a job"
applications.md"Check my email for new applications"
"I have an interview with [Company] on [Date]"
"What's my job search looking like?"
applications.md"I got rejected from [Company]"
"I got an offer"
"Which resume should I send?"
resumes/"Does this sound desperate / templated?"
Be honest with the user about what this skill does. It directs the assistant to use tools the user has connected (Gmail, LinkedIn, browser automation, web search) when those tools are available. This skill does not bundle or ship those tools — it instructs the assistant to invoke whichever ones the user has authorized. The data those tools touch is real and sensitive: emails, recruiter contacts, salary figures, offer details, and personal employment history.
The skill itself does not transmit data, run background processes, or persist anything outside the user's working directory. What it directs the assistant to do, the user can see and stop at any time.
Data scope and consent rules
applications.md, resumes/, drafts, dashboards, and any generated documents are written to the user's current working directory. The skill does not write data anywhere else.What a cautious user should know before installing
This skill is most useful when Gmail and LinkedIn tools are connected, but those connections are not required. Users uncomfortable with broad Gmail or LinkedIn access can use the skill in tracker-only mode by simply not connecting those tools — the assistant will then work from what the user tells it directly, and every workflow above still functions.