apply
Assisted job-application filler. Given a job posting URL, open it in a browser via Playwright, extract the JD and company, score…
Collect fresh job-posting URLs into ~/.dear-hiring-manager/urls.txt by running an Apify job scraper — the discovery source for /batch. Runs a configured Apify actor via the Apify API (Bearer-header auth) with a search built from the profile's desired titles + level + location,
Claude Code
$ npx -y skills add extrasmall0/dear-hiring-manager --skill apify-collect --agent claude-code
Codex
$ npx skills add extrasmall0/dear-hiring-manager --skill apify-collect -a codex -y
Cursor
$ npx skills add extrasmall0/dear-hiring-manager --skill apify-collect -a cursor -y
Gemini CLI
$ npx skills add extrasmall0/dear-hiring-manager --skill apify-collect -a gemini-cli -y
GitHub Copilot
$ npx skills add extrasmall0/dear-hiring-manager --skill apify-collect -a github-copilot -y
OpenCode
$ npx skills add extrasmall0/dear-hiring-manager --skill apify-collect -a opencode -y
Windsurf
$ npx skills add extrasmall0/dear-hiring-manager --skill apify-collect -a windsurf -y
name: apify-collect description: Collect fresh job-posting URLs into ~/.dear-hiring-manager/urls.txt by running an Apify job scraper — the discovery source for /batch. Runs a configured Apify actor via the Apify API (Bearer-header auth) with a search built from the profile's desired titles + level + location, extracts the direct application URL per job, and de-dupes against already-submitted jobs. Use for /apify-collect.
Gather fresh job URLs into `~/.dear-hiring-manager/urls.txt` (the single input to `/dear-hiring-manager:batch`) by running an **Apify** job scraper — purpose-built, far fresher and more complete than web search.
the `APIFY_TOKEN` env var. **Never** put it in the repo, in a URL, in command output, or in any log (`.env` is gitignored).
choice). Set it in the same `.env`, or ask the user which actor to use.
(actor input schemas differ — there is no universal `search`/`location` contract). Put it in `~/.dear-hiring-manager/apify.json` (or point to a file). If it's absent, **fetch the actor's input schema first** (`GET https://api.apify.com/v2/acts/$APIFY_ACTOR` with the Bearer header) and build the input from the schema + the profile targets, then confirm with the user before running.
1. **Load the token without echoing it**, e.g. `APIFY_TOKEN=$(grep -m1 '^APIFY_TOKEN=' ~/.dear-hiring-manager/.env | cut -d= -f2-)` (fall back to the env var); same for `APIFY_ACTOR`. If the token is missing, stop and tell the user to put it in `~/.dear-hiring-manager/.env`. Never print the token or a command with it expanded. 2. **Build the search** from the profile: `Desired job title(s)` + `Target experience level` + preferred locations / remote. Only ask the user if those profile fields are blank. 3. **Build the actor input** from `APIFY_INPUT` (the actor's own field names) or, if unset, from the fetched input schema + profile targets (step above). **Run the actor** synchronously with **header auth, never the URL:**
curl -sS -X POST \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d "$APIFY_INPUT" \
"https://api.apify.com/v2/acts/$APIFY_ACTOR/run-sync-get-dataset-items"No `?token=` in the URL; do not echo the token or the expanded command. 4. **Extract the application URL** per returned item. **Do NOT assume a field name** — actor outputs differ. Scan each item for URL-valued fields and pick the **direct company/ATS apply link** (a field like `applyUrl` / `externalApplyUrl` / `companyApplyUrl`, or any Greenhouse/Lever/Ashby/Workday URL), preferring it over the aggregator `jobUrl` (linkedin.com / indeed.com). Skip items with only an Easy-Apply / no external URL. If no item yields a usable URL, tell the user the actor's output shape doesn't expose one.
status is `submitted`, `rejected`, `interview`, `offer`, or **`filled`**. (`filled` = form filled and **parked awaiting the user's Submit** — a success, not a failure; re-queuing it would duplicate the application and add a second tracker row.) **Only `blocked` and `in-progress` re-queue** — a CAPTCHA / login block or a crashed run deserves a retry. `skipped` stays out unless the user lowers the fit threshold; re-queuing a `filled` job requires an explicit retry request from the user.
each URL). Show the user the list + count; append or replace on their confirmation, never clobber silently.
handles less well.
Fills your job applications so you never have to write another 'Dear Hiring Manager.' It reads the job description, scores how well you fit, fills every field from your saved profile, and drafts open-ended answers and a cover letter in your own voice.
Assisted job-application filler. Given a job posting URL, open it in a browser via Playwright, extract the JD and company, score…
Batch job-application filler. Given several job URLs (or a urls.txt file), run the assisted-apply flow for each in its own…
Application tracker board. Read ~/.dear-hiring-manager/applications.md and render a status board (grouped by…
Generate a tailored, truthful cover letter from the user's resume, profile, and a specific job description. Draft it in the…
Make generated prose read like a real person wrote it, not AI. A shared rulebook of banned words, punctuation rules, and…
Interview the user and build their job-application profile — identity, contact, work authorization, EEO/demographics, and the…
Assists with job applications: evaluating job postings, tailoring CVs, writing cover letters, and preparing for interviews.…
Prepares the user for a specific interview from their real experience. Builds a story bank in…
Search flights, hotels, attractions, concerts, and travel deals with natural language. FlyAI connects to Fliggy MCP for real-time…