Job Application Assistant
This skill turns a resume and a short set of criteria into a repeatable job
search: find listings that fit, keep a log so nothing is searched or applied
to twice, and optionally fill out (but not necessarily submit) application
forms in the user's browser. It is meant to be installed by different
people, so treat every person's resume, criteria, and application history as
private to them — never copy another user's data into this skill file
itself.
The workflow has three phases. Figure out which one the user is in before
doing anything else:
- First-time setup — no criteria doc exists yet, or the user is asking
to get started.
- A search/apply run — criteria doc exists; the user wants matches, a
digest, or forms filled out.
- Scheduling — the user wants this to happen automatically on a
cadence, without them asking each time.
Where things are stored
Two durable documents make this workflow repeatable instead of a one-off:
- The criteria doc (
references/context-doc-template.md is the
template) — the user's target roles, locations, salary floor, and
dealbreakers, plus their default preference for auto-submitting
applications.
- The application log (
references/application-log-template.md is the
template) — every listing seen or applied to, so a scheduled run never
re-surfaces or re-applies to the same job.
If this session is attached to a claude.ai Project (check for a Projects
tool), write both docs there with project_write — e.g.
job-search-criteria.md and job-search-log.md — and read them back with
project_read / project_search at the start of every run. This is
strongly preferred: it's what makes a scheduled run (a fresh session with
no memory of this conversation) able to pick up where the last run left off.
If no Project is attached, fall back to local files in the working directory
and tell the user plainly that this data will not persist once the session
ends — offer to attach a Project or have them save the files somewhere
durable.
Resumes are never fabricated or edited by this skill — only read for
matching and for autofilling forms.
Phase 1: First-time setup
Run this the first time a user invokes the workflow, or whenever no criteria
doc is found.
Get the resume. Check for an already-uploaded resume (a Project file,
or a file attached to the conversation). If none exists, ask the user to
attach or upload one — PDF or docx both work. Read it to understand their
experience, titles held, seniority, and skills; this context is what
later steps rank listings against, so actually read it, don't skim the
filename.
Interview the user for the criteria doc. Use AskUserQuestion (or,
if unavailable, plain conversational questions) to gather the standard
set below. Ask in a few batched questions rather than one at a time if
using AskUserQuestion — it supports multiple questions per call. Cover:
- Target job titles / roles (a few variants — people search different
terms for the same role)
- Locations and remote/hybrid/onsite preference
- Minimum acceptable salary (optional but improves filtering)
- Industries or company types to include or explicitly avoid
- Years of experience to represent (usually inferable from the resume,
confirm rather than re-derive from scratch)
- Work authorization / sponsorship needs, if relevant to the user
- Dealbreakers (anything that should auto-exclude a listing)
- Which sources to search: LinkedIn, Indeed, specific company career
pages, or all of the above
- Default behavior when an application is ready: stop and let the user
review before submitting, or submit automatically. Default to
"stop and review" unless the user clearly asks for full automation —
autofilled forms can contain a wrong guess, and a submitted application
is hard to take back.
Write the criteria doc as soon as the interview is done, following
references/context-doc-template.md. Don't wait until every other setup
step is finished to save it.
Create an empty application log from
references/application-log-template.md so the first real run has
somewhere to write.
Confirm with the user what was captured (a short summary, not a full
reprint of the doc) and ask if anything needs correcting before the first
real run.
Phase 2: A search / apply run
Load context. Read the criteria doc, the application log, and (if not
already in context) the resume.
Search. For each configured source:
- Prefer a plain web search (
WebSearch/WebFetch) for discovery when
possible — it doesn't require the user's browser or a logged-in
session, which matters a lot for a scheduled, unattended run.
- Use Chrome automation (load the
claude-in-chrome skill first, then
the mcp__claude-in-chrome__* tools) when a source needs a logged-in
session to see full results or listing details — e.g., LinkedIn Jobs
often does. This only works when the user's Chrome is connected, so it
is not reliable inside an unattended scheduled run; note that limit to
the user during setup rather than discovering it mid-run.
- Company career pages: search or navigate directly, since these are
usually public.
Filter and rank. Drop anything already in the application log
(compare by listing URL or by company + title + posted date). Drop
anything that fails a stated dealbreaker. Rank what's left by fit against
the resume — title match, seniority match, location/remote match, and
any explicit must-haves. Don't just return everything that matched a
keyword search; the value of this skill is the filtering.
Present the results. Give the user a short ranked digest — company,
title, location, why it's a fit, link — not a wall of raw search output.
If this is an unattended/scheduled run (see Phase 3), this digest is
the deliverable; stop here unless the criteria doc says otherwise.
Fill out applications, when asked. For listings the user (or the
criteria doc's default) says to proceed with:
- Open the application in Chrome and fill every field it asks for using
the resume and criteria doc as the source of truth.
- For free-text screening questions, answer truthfully from what's
actually in the resume/criteria doc. If a question needs information
the skill doesn't have (e.g., "why do you want to work here"), don't
invent an answer — draft something clearly marked as a draft and flag
it for the user to review or write themselves, or leave it blank and
tell the user it needs their input.
- Upload the resume file where the form asks for one.
- Stop before the final submit unless the criteria doc's default (or
an explicit instruction for this run) says to auto-submit. When
stopping, tell the user the application is filled and ready for their
review.
- Either way — filled, submitted, or abandoned — record it in the
application log immediately, so a future run never repeats the work.
Phase 3: Scheduling
Scheduled runs must use the scheduled-task tools (create_trigger /
update_trigger / list_triggers / delete_trigger) — never a local/
in-process cron tool, since anything scheduled that way is lost the moment
this session ends.
Recommended default: a daily digest with no auto-apply. The scheduled
prompt should tell the fresh session to read the criteria doc and
application log, search sources, filter against the log, and message the
user a ranked digest — explicitly not to fill out or submit anything. This
is the safe default because a scheduled run is unattended by definition, and
autofilling or submitting without anyone reviewing it is exactly the kind of
irreversible action that should wait for a person.
When creating the trigger:
- Write the
prompt as a complete, standalone instruction — the fresh
session that runs it has no memory of this conversation. It should name
this skill, name where the criteria doc/log live (which Project, if any),
and state clearly that it should stop at the digest unless told otherwise.
- A daily cadence is typical; use a cron expression at a reasonable hour in
the user's timezone (convert to UTC). Don't schedule more often than
daily unless the user asks — job boards don't refresh fast enough to
justify it, and it burns their scheduled-run budget.
- If the user wants scheduled runs to also fill applications (not just
digest), that only works reliably if their Chrome stays connected at fire
time — say so plainly, and suggest they treat auto-fill as something to
trigger manually right after reviewing a digest, rather than as part of
the unattended schedule, unless they've confirmed the browser bridge is
reliably available on that schedule.
- Never set the trigger to auto-submit applications without an explicit,
clear request from the user to do so — confirm it back to them in plain
language before creating or updating the trigger that way.
To change an existing schedule's cadence or behavior, use update_trigger
on its existing ID rather than deleting and recreating — it preserves run
history. Use list_triggers to find the ID if it's not already known.
Notes for whoever installs this skill
This skill is shared, but the data it produces is not: each person's
criteria doc, application log, and resume belong to them. When setting this
up for a new user, do not reuse or reference another user's saved criteria
or log — start Phase 1 fresh. If multiple people share one Project, use
distinctly named docs per person (e.g. job-search-criteria-alex.md) rather
than one shared file.
Job boards' terms of service vary on automated access — search-based
discovery is generally fine, but be judicious about high-frequency scraping
or anything that looks like evading a site's normal usage limits.
1---2name: job-application-assistant3description: Runs an end-to-end job search workflow — finds job listings across LinkedIn, Indeed, and company career pages that match a saved resume and criteria doc, ranks them, and (when asked) autofills the application forms in Chrome for review. Use this skill whenever the user wants to search for jobs, find listings that match their background, set up a recurring job search, get a digest of new postings, or have an application form filled out automatically. Also use it for first-time setup ("help me set up my job search," "I want to automate applying to jobs") and for creating or updating a scheduled/recurring job search run. Trigger on phrases like "find me jobs," "search for openings," "fill out this application," "apply to this job for me," "set up a daily job search," or "what jobs match my resume."4---56# Job Application Assistant78This skill turns a resume and a short set of criteria into a repeatable job9search: find listings that fit, keep a log so nothing is searched or applied10to twice, and optionally fill out (but not necessarily submit) application11forms in the user's browser. It is meant to be installed by different12people, so treat every person's resume, criteria, and application history as13private to them — never copy another user's data into this skill file14itself.1516The workflow has three phases. Figure out which one the user is in before17doing anything else:18191. **First-time setup** — no criteria doc exists yet, or the user is asking20 to get started.212. **A search/apply run** — criteria doc exists; the user wants matches, a22 digest, or forms filled out.233. **Scheduling** — the user wants this to happen automatically on a24 cadence, without them asking each time.2526## Where things are stored2728Two durable documents make this workflow repeatable instead of a one-off:2930- **The criteria doc** (`references/context-doc-template.md` is the31 template) — the user's target roles, locations, salary floor, and32 dealbreakers, plus their default preference for auto-submitting33 applications.34- **The application log** (`references/application-log-template.md` is the35 template) — every listing seen or applied to, so a scheduled run never36 re-surfaces or re-applies to the same job.3738If this session is attached to a claude.ai Project (check for a `Projects`39tool), write both docs there with `project_write` — e.g.40`job-search-criteria.md` and `job-search-log.md` — and read them back with41`project_read` / `project_search` at the start of every run. This is42strongly preferred: it's what makes a *scheduled* run (a fresh session with43no memory of this conversation) able to pick up where the last run left off.44If no Project is attached, fall back to local files in the working directory45and tell the user plainly that this data will not persist once the session46ends — offer to attach a Project or have them save the files somewhere47durable.4849Resumes are never fabricated or edited by this skill — only read for50matching and for autofilling forms.5152## Phase 1: First-time setup5354Run this the first time a user invokes the workflow, or whenever no criteria55doc is found.56571. **Get the resume.** Check for an already-uploaded resume (a Project file,58 or a file attached to the conversation). If none exists, ask the user to59 attach or upload one — PDF or docx both work. Read it to understand their60 experience, titles held, seniority, and skills; this context is what61 later steps rank listings against, so actually read it, don't skim the62 filename.63642. **Interview the user for the criteria doc.** Use `AskUserQuestion` (or,65 if unavailable, plain conversational questions) to gather the standard66 set below. Ask in a few batched questions rather than one at a time if67 using AskUserQuestion — it supports multiple questions per call. Cover:68 - Target job titles / roles (a few variants — people search different69 terms for the same role)70 - Locations and remote/hybrid/onsite preference71 - Minimum acceptable salary (optional but improves filtering)72 - Industries or company types to include or explicitly avoid73 - Years of experience to represent (usually inferable from the resume,74 confirm rather than re-derive from scratch)75 - Work authorization / sponsorship needs, if relevant to the user76 - Dealbreakers (anything that should auto-exclude a listing)77 - Which sources to search: LinkedIn, Indeed, specific company career78 pages, or all of the above79 - Default behavior when an application is ready: **stop and let the user80 review before submitting**, or **submit automatically**. Default to81 "stop and review" unless the user clearly asks for full automation —82 autofilled forms can contain a wrong guess, and a submitted application83 is hard to take back.8485 Write the criteria doc as soon as the interview is done, following86 `references/context-doc-template.md`. Don't wait until every other setup87 step is finished to save it.88893. **Create an empty application log** from90 `references/application-log-template.md` so the first real run has91 somewhere to write.92934. **Confirm with the user** what was captured (a short summary, not a full94 reprint of the doc) and ask if anything needs correcting before the first95 real run.9697## Phase 2: A search / apply run98991. **Load context.** Read the criteria doc, the application log, and (if not100 already in context) the resume.1011022. **Search.** For each configured source:103 - Prefer a plain web search (`WebSearch`/`WebFetch`) for discovery when104 possible — it doesn't require the user's browser or a logged-in105 session, which matters a lot for a *scheduled, unattended* run.106 - Use Chrome automation (load the `claude-in-chrome` skill first, then107 the `mcp__claude-in-chrome__*` tools) when a source needs a logged-in108 session to see full results or listing details — e.g., LinkedIn Jobs109 often does. This only works when the user's Chrome is connected, so it110 is not reliable inside an unattended scheduled run; note that limit to111 the user during setup rather than discovering it mid-run.112 - Company career pages: search or navigate directly, since these are113 usually public.1141153. **Filter and rank.** Drop anything already in the application log116 (compare by listing URL or by company + title + posted date). Drop117 anything that fails a stated dealbreaker. Rank what's left by fit against118 the resume — title match, seniority match, location/remote match, and119 any explicit must-haves. Don't just return everything that matched a120 keyword search; the value of this skill is the filtering.1211224. **Present the results.** Give the user a short ranked digest — company,123 title, location, why it's a fit, link — not a wall of raw search output.124 If this is an unattended/scheduled run (see Phase 3), this digest *is*125 the deliverable; stop here unless the criteria doc says otherwise.1261275. **Fill out applications, when asked.** For listings the user (or the128 criteria doc's default) says to proceed with:129 - Open the application in Chrome and fill every field it asks for using130 the resume and criteria doc as the source of truth.131 - For free-text screening questions, answer truthfully from what's132 actually in the resume/criteria doc. If a question needs information133 the skill doesn't have (e.g., "why do you want to work here"), don't134 invent an answer — draft something clearly marked as a draft and flag135 it for the user to review or write themselves, or leave it blank and136 tell the user it needs their input.137 - Upload the resume file where the form asks for one.138 - **Stop before the final submit** unless the criteria doc's default (or139 an explicit instruction for this run) says to auto-submit. When140 stopping, tell the user the application is filled and ready for their141 review.142 - Either way — filled, submitted, or abandoned — record it in the143 application log immediately, so a future run never repeats the work.144145## Phase 3: Scheduling146147Scheduled runs must use the scheduled-task tools (`create_trigger` /148`update_trigger` / `list_triggers` / `delete_trigger`) — never a local/149in-process cron tool, since anything scheduled that way is lost the moment150this session ends.151152Recommended default: **a daily digest with no auto-apply.** The scheduled153prompt should tell the fresh session to read the criteria doc and154application log, search sources, filter against the log, and message the155user a ranked digest — explicitly *not* to fill out or submit anything. This156is the safe default because a scheduled run is unattended by definition, and157autofilling or submitting without anyone reviewing it is exactly the kind of158irreversible action that should wait for a person.159160When creating the trigger:161- Write the `prompt` as a complete, standalone instruction — the fresh162 session that runs it has no memory of this conversation. It should name163 this skill, name where the criteria doc/log live (which Project, if any),164 and state clearly that it should stop at the digest unless told otherwise.165- A daily cadence is typical; use a cron expression at a reasonable hour in166 the user's timezone (convert to UTC). Don't schedule more often than167 daily unless the user asks — job boards don't refresh fast enough to168 justify it, and it burns their scheduled-run budget.169- If the user wants scheduled runs to also *fill* applications (not just170 digest), that only works reliably if their Chrome stays connected at fire171 time — say so plainly, and suggest they treat auto-fill as something to172 trigger manually right after reviewing a digest, rather than as part of173 the unattended schedule, unless they've confirmed the browser bridge is174 reliably available on that schedule.175- Never set the trigger to auto-submit applications without an explicit,176 clear request from the user to do so — confirm it back to them in plain177 language before creating or updating the trigger that way.178179To change an existing schedule's cadence or behavior, use `update_trigger`180on its existing ID rather than deleting and recreating — it preserves run181history. Use `list_triggers` to find the ID if it's not already known.182183## Notes for whoever installs this skill184185This skill is shared, but the data it produces is not: each person's186criteria doc, application log, and resume belong to them. When setting this187up for a new user, do not reuse or reference another user's saved criteria188or log — start Phase 1 fresh. If multiple people share one Project, use189distinctly named docs per person (e.g. `job-search-criteria-alex.md`) rather190than one shared file.191192Job boards' terms of service vary on automated access — search-based193discovery is generally fine, but be judicious about high-frequency scraping194or anything that looks like evading a site's normal usage limits.