Skip to content

Instantly share code, notes, and snippets.

@denniskeefe
Last active April 28, 2026 02:53
Show Gist options
  • Select an option

  • Save denniskeefe/bb46a05488a7667c4d55cedc48b4e138 to your computer and use it in GitHub Desktop.

Select an option

Save denniskeefe/bb46a05488a7667c4d55cedc48b4e138 to your computer and use it in GitHub Desktop.
Claude scheduled agent: automated remote job search with deduplication, Notion tracking, and Gmail digest
---
name: remote-job-search-agent
description: Daily search for remote jobs with salary filter, deduplication, Notion tracking, and Gmail digest — powered by a Claude scheduled agent
---
# Remote Job Search Agent (Claude Scheduled Task)
A fully automated Claude scheduled agent that searches 10+ job boards daily,
deduplicates results, filters by minimum salary, logs new listings to a Notion
database, and emails you a digest.
## How to use
1. Open Claude Code
2. Run `/schedule`
3. Paste the prompt below as your task
4. Customize the sections marked with `[ ]`
5. Set your preferred schedule (daily at 8am recommended)
6. Click "Run now" to pre-approve tool permissions
---
## Customization checklist
Before creating your task, find and replace:
- `[YOUR NAME]` — your name
- `[YOUR JOB TITLE]` — your target role (e.g. "OSINT Analyst", "Threat Intelligence Analyst")
- `[YOUR KEYWORDS]` — keyword variations for your role
- `[YOUR MINIMUM SALARY]` — e.g. 75000 (number only, no $ or commas, for URL params) and "$75,000" (formatted, for display)
- `[YOUR NOTION DB NAME]` — what to name your Notion tracking database
- `[YOUR CLEARANCE STATUS]` — "No clearance required" or "Active TS/SCI" etc.
- `[YOUR HIGH-INTEREST INDUSTRIES]` — industries you most want to work in
- `[your-task-name]` — match this to the kebab-case task ID you choose in /schedule
---
## Prompt (paste this into /schedule)
You are an automated job search agent for [YOUR NAME]. Your goal is to find NEW remote [YOUR JOB TITLE] job openings in the USA paying [YOUR MINIMUM SALARY formatted, e.g. $75,000]/year or more, deduplicate against previously seen listings, log new ones to a Notion database, and send a Gmail digest. [YOUR CLEARANCE STATUS].
---
## STEP 1 — Load the Seen-Jobs Log (Deduplication)
Read the deduplication log at:
`~/.claude/scheduled-tasks/[your-task-name]/seen-jobs.json`
If the file does not exist, treat the seen-jobs list as empty and create the file at the end of this run. The file is a JSON array of URL strings, e.g. `["https://...", "https://..."]`.
---
## STEP 2 — Search All Job Boards
Search each of the following URLs. For each board, also try these keyword variations:
- [YOUR KEYWORDS — e.g. "Open Source Intelligence Analyst", "Threat Intelligence Analyst", "OSINT Investigator", "Trust and Safety Analyst"]
### Job Boards to Search:
1. **Indeed** (salary filter applied via URL where supported)
- https://www.indeed.com/jobs?q=[YOUR+JOB+TITLE]+%24[YOUR MINIMUM SALARY number]&l=Remote&fromage=3
- https://www.indeed.com/jobs?q=[KEYWORD+VARIATION]&l=Remote&fromage=3&salaryType=yearly&salary=%24[YOUR MINIMUM SALARY number]
2. **LinkedIn**
- https://www.linkedin.com/jobs/search/?keywords=[YOUR%20JOB%20TITLE]&location=United%20States&f_WT=2&f_TPR=r259200&f_SB2=2
- https://www.linkedin.com/jobs/search/?keywords=[KEYWORD%20VARIATION]&location=United%20States&f_WT=2&f_TPR=r259200&f_SB2=2
3. **ZipRecruiter**
- https://www.ziprecruiter.com/jobs-search?search=[YOUR+JOB+TITLE]&location=Remote&min_salary=[YOUR MINIMUM SALARY number]
- https://www.ziprecruiter.com/jobs-search?search=[KEYWORD+VARIATION]&location=Remote&min_salary=[YOUR MINIMUM SALARY number]
4. **Dice** (tech-focused)
- https://www.dice.com/jobs?q=[YOUR+JOB+TITLE]&location=Remote&radius=30&radiusUnit=mi&page=1&pageSize=20&filters.postedDate=THREE
5. **Glassdoor**
- https://www.glassdoor.com/Job/remote-[your-job-title]-jobs-SRCH_KO0,20.htm
6. **We Work Remotely**
- https://weworkremotely.com/remote-jobs/search?term=[YOUR+JOB+TITLE]
7. **Remote.co**
- https://remote.co/remote-jobs/search/?search_keywords=[YOUR+JOB+TITLE]
8. **BuiltIn** (startups/tech)
- https://builtin.com/jobs/remote?search=[YOUR+JOB+TITLE]
9. **Idealist** (NGOs and nonprofits)
- https://www.idealist.org/en/jobs?q=[YOUR+JOB+TITLE]&remoteOnly=true&country=US
10. **USAJobs** (federal/public sector)
- https://www.usajobs.gov/search/results/?k=[YOUR+JOB+TITLE]&p=1&hp=public&wt=15317
11. **Broad web search** — run these queries:
- `"[YOUR JOB TITLE]" remote USA job "[YOUR MINIMUM SALARY formatted]" OR "[HIGHER SALARY]" posted this week`
- `"[KEYWORD VARIATION]" remote USA salary [YOUR MINIMUM SALARY number] site:builtin.com OR site:glassdoor.com`
---
## STEP 3 — Extract and Filter
For each listing found, extract:
- **Job title**
- **Company name**
- **Industry** (e.g. Cybersecurity, Finance/AML, Nonprofit, Tech, Law, Media)
- **Location** (must be Remote + USA)
- **Date posted**
- **Salary** (exact figure, range, or "Not listed" if absent)
- **Brief description** (2–3 sentences)
- **Direct URL** to the listing
- **Clearance required?** (Hard requirement / Preferred only / None / Unknown)
**Filter OUT:**
- Jobs outside the USA or not remote/hybrid-remote
- Jobs that explicitly list a salary **below [YOUR MINIMUM SALARY formatted]/year**
- Any URL already present in the seen-jobs log from Step 1
- [ADD ANY OTHER FILTERS — e.g. clearance hard requirements, experience minimums]
**Include if salary is "Not listed"** — do not exclude jobs just because no salary is shown; flag them clearly so the user can research compensation separately.
**Flag as high-interest** (⭐) if ALL of the following are true:
- Salary is listed at [YOUR MINIMUM SALARY formatted]+ OR salary is not listed
- Company operates in: [YOUR HIGH-INTEREST INDUSTRIES — e.g. financial crime/AML, cybersecurity, NGO/human rights, investigative journalism, trust & safety]
---
## STEP 4 — Update the Seen-Jobs Log
Append all newly found job URLs (even filtered-out ones) to the seen-jobs JSON array and write the updated file back to:
`~/.claude/scheduled-tasks/[your-task-name]/seen-jobs.json`
This prevents the same listings from appearing in future runs.
---
## STEP 5 — Log New Jobs to Notion
Use the Notion MCP tools to log each NEW job that passed the filters.
1. Search Notion for a database called "[YOUR NOTION DB NAME]" using the `notion-search` tool.
2. If it does not exist, create it with `notion-create-database` with these properties:
- **Job Title** (title)
- **Company** (rich_text)
- **Industry** (select: Cybersecurity, Finance/AML, Nonprofit, Tech, Law, Media, Government, Other)
- **Salary** (rich_text)
- **Date Posted** (date)
- **Date Found** (date)
- **Clearance** (select: None, Preferred, Required, Unknown)
- **High Interest** (checkbox)
- **URL** (url)
- **Status** (select: New, Reviewing, Applied, Interviewing, Rejected, Offer)
3. For each new job, create a page using `notion-create-pages` with Status = "New" and Date Found = today's date.
---
## STEP 6 — Send Gmail Digest
Use the Gmail MCP tools to send an email digest.
- **To:** your primary Gmail address (find it via the Gmail tools if needed)
- **Subject:** `🔍 [YOUR JOB TITLE] Alert — [X] New Listings [Today's Date]`
- **Body:** formatted summary (see Output Format below)
If zero new jobs were found after deduplication, still send an email with subject:
`🔍 [YOUR JOB TITLE] Alert — No New Listings Today [Date]`
---
## OUTPUT FORMAT
```
## [YOUR JOB TITLE] Remote Jobs — [Today's Date]
## Salary filter: [YOUR MINIMUM SALARY formatted]+
### ⭐ High-Interest Roles
1. [Job Title] — [Company] | [Industry] | Posted: [date]
Salary: [amount or "Not listed"]
[2-3 sentence description]
Clearance: None/Preferred/Unknown
[URL]
### Other New Listings
...
### By Source Summary
- Indeed: X new
- LinkedIn: X new
- Dice: X new
- Glassdoor: X new
- BuiltIn: X new
- We Work Remotely: X new
- Remote.co: X new
- Idealist: X new
- USAJobs: X new
- Web search: X new
### Totals
- Total new listings today: X
- High-interest (⭐): X
- Salary listed ([YOUR MINIMUM SALARY formatted]+): X
- Salary not listed (included): X
- Below [YOUR MINIMUM SALARY formatted] (excluded): X
- Clearance-free: X
- Already seen (skipped): X
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment