Unified skill for job hunting automation: Discover → Apply → Track.
ClawHub: https://clawhub.ai/QuantDeveloperUSA/jobs-hunter-claw
GitHub: https://github.com/ABFS-Inc/jobs-hunter-claw
bash
# Install the skill
clawhub install jobs-hunter-claw
# Verify installation
clawhub list
# Fix executable permission (required after install)
chmod +x /path/to/skills/jobs-hunter-claw/scripts/job-tracker.sh
bash
# Clone to your skills directory
git clone https://github.com/ABFS-Inc/jobs-hunter-claw.git /path/to/skills/jobs-hunter-claw
The skill uses gog for Google Sheets access:
bash
# Install gog
brew install steipete/tap/gogcli
# Authenticate with Google
gog auth credentials /path/to/client_secret.json
gog auth add your@gmail.com --services sheets
Create a Google Sheet with these tabs:
TabPurposeJobsMain tracker (columns A-P)Activity LogTimestamped event historyAdd or Edit JobForm interface (optional)
See references/google-sheet-setup.md for detailed setup.
Set the environment variable with your Google Sheet ID:
bash
export JOB_TRACKER_SPREADSHEET_ID="your-google-sheet-id"
The ID is found in your Google Sheet URL:
text
https://docs.google.com/spreadsheets/d/[THIS-IS-THE-ID]/edit
For persistent configuration, add to your shell profile ( ~/.bashrc, ~/.zshrc):
bash
echo 'export JOB_TRACKER_SPREADSHEET_ID="your-google-sheet-id"' >> ~/.bashrc
For OpenClaw agents, set in the agent's environment or TOOLS.md.
bash
# Set your spreadsheet ID first
export JOB_TRACKER_SPREADSHEET_ID="your-google-sheet-id"
# View all commands
./scripts/job-tracker.sh help
# Add a discovered job
./scripts/job-tracker.sh add --company "Morgan Stanley" --role "AI Architect" --source LinkedIn
# List active interviews
./scripts/job-tracker.sh list --status interview
# Log an event
./scripts/job-tracker.sh log JOB002 --event interview_scheduled --details "3rd round Monday 10am"
# Search jobs
./scripts/job-tracker.sh search "citi" --columns company,role
Create a dedicated agent to run job hunting automation.
This skill requires google/gemini-flash-latest for optimal performance and cost efficiency.
Gemini Flash provides:
Do not use Opus, Sonnet, or other premium models — they're overkill for this skill and will incur unnecessary costs.
bash
openclaw agents create job-hunter \
--model google/gemini-flash-latest \
--workspace /path/to/workspace-job-hunter
Create IDENTITY.md in the agent workspace:
markdown
# IDENTITY.md
- **Name:** [First Name] [Last Name]
- **Creature:** Career automation assistant
- **Vibe:** Proactive, organized, candidate-focused
- **Emoji:** 🎯
Create TOOLS.md in the agent workspace with the spreadsheet ID:
markdown
# TOOLS.md
## Environment Variables
Set before running job-tracker commands:
- `JOB_TRACKER_SPREADSHEET_ID` — Your Google Sheet ID
## Jobs Hunter Claw Skill
**Installed at:** `/openclaw/skills/jobs-hunter-claw`
### Usage
```bash
# Set spreadsheet ID
export JOB_TRACKER_SPREADSHEET_ID="your-sheet-id"
# Run commands
/openclaw/skills/jobs-hunter-claw/scripts/job-tracker.sh list
/openclaw/skills/jobs-hunter-claw/scripts/job-tracker.sh add --company "X" --role "Y"
text
### 4. Configure Heartbeat (Optional)
Create `HEARTBEAT.md` for periodic checks:
```markdown
# HEARTBEAT.md
## Periodic Checks
- [ ] Scan email for recruiter messages
- [ ] Check calendar for upcoming interviews
- [ ] Review jobs with status "Interview" for follow-ups
- [ ] Look for new job postings matching profile
Automate job hunting tasks with OpenClaw cron jobs.
Important: Cron jobs need the spreadsheet ID in the task prompt or agent environment.
bash
openclaw cron add \
--id job-email-scan \
--schedule "0 14-23 * * 1-5" \
--agent job-hunter \
--channel "channel:YOUR_DISCORD_CHANNEL_ID" \
--task "Set JOB_TRACKER_SPREADSHEET_ID from TOOLS.md, then scan email for job-related messages. Use /openclaw/skills/jobs-hunter-claw/scripts/job-tracker.sh for updates."
Schedule: Every hour from 9 AM - 6 PM EST (14-23 UTC), Monday-Friday.
bash
openclaw cron add \
--id job-weekly-review \
--schedule "0 14 * * 1" \
--agent job-hunter \
--channel "channel:YOUR_DISCORD_CHANNEL_ID" \
--task "Weekly pipeline review. Set JOB_TRACKER_SPREADSHEET_ID, then:
1. job-tracker.sh list --status Interview
2. job-tracker.sh list --status Applied
3. job-tracker.sh list --status Discovered
Report summary and recommended actions."
Schedule: Monday 9 AM EST (14:00 UTC).
bash
# List all cron jobs
openclaw cron list
# Pause/resume a job
openclaw cron pause job-email-scan
openclaw cron resume job-email-scan
# Delete a job
openclaw cron delete job-email-scan
CommandDescriptionaddAdd new job with auto-generated IDupdateModify existing job fieldsdeleteDelete a job (clears row, preserves logs)logAdd timestamped activity entryshowDisplay detailed job viewlistList jobs with optional filterssearchSearch with regex or fuzzy matchinglogsView activity historynext-idGet next available job IDschemaShow valid statuses and event typeshelpShow command help
bash
./scripts/job-tracker.sh add \
--company "Goldman Sachs" \
--role "VP, AI Engineering" \
--location "NYC" \
--salary "$200k-$275k" \
--source "LinkedIn" \
--url "https://linkedin.com/jobs/view/123456" \
--status Discovered
Required: --company, --role
bash
./scripts/job-tracker.sh update JOB015 \
--status Applied \
--resume "AI-Architect-Resume-v3" \
--applied-date "2026-03-19"
bash
./scripts/job-tracker.sh log JOB015 \
--event interview_scheduled \
--details "3rd round with VP Engineering, Monday 10am"
bash
# Delete with confirmation prompt
./scripts/job-tracker.sh delete JOB015
# Delete without confirmation (for scripts/automation)
./scripts/job-tracker.sh delete JOB015 --force
Note: Delete clears the row data but preserves the activity log history.
bash
# Simple text search
./scripts/job-tracker.sh search "goldman"
# Search specific columns
./scripts/job-tracker.sh search "AI.*Architect" --columns role --regex
# Fuzzy search
./scripts/job-tracker.sh search "goldmn" --fuzzy
bash
# By status
./scripts/job-tracker.sh list --status interview
# Limit results
./scripts/job-tracker.sh list --limit 10
# JSON output
./scripts/job-tracker.sh list --json
StatusMeaningDiscoveredFound but not yet appliedAppliedApplication submittedScreeningInitial review/HR screenInterviewActive interview processKarat Test ScheduledTechnical assessment pendingOfferOffer receivedRejectedNot selectedWithdrawnCandidate withdrewAcceptedOffer acceptedClosedPosition no longer available
The CLI auto-normalizes status to Title Case ( interview → Interview).
EventMeaningdiscoveredInitial job discoveryappliedApplication submittedrecruiter_contactRecruiter reached outuser_replyYou responded to recruiterinterview_scheduledInterview bookedinterview_completedInterview donetest_scheduledAssessment bookedtest_completedAssessment doneoffer_receivedOffer extendedrejectionApplication rejectedfollow_upFollow-up action neededstatus_changeStatus was updatednoteGeneral note
Contacts must be Google Contacts links:
text
https://contacts.google.com/person/c[alphanumeric]
Bypass with --no-strict-contacts flag.
For manual job entry via the Google Sheet form tab, install the Apps Script:
Code.gsscripts/job-tracker-appscript.jstext
jobs-hunter-claw/
├── SKILL.md # This file
├── README.md # GitHub readme
├── scripts/
│ ├── job-tracker.sh # CLI for CRUD operations
│ └── job-tracker-appscript.js # Google Apps Script
└── references/
└── google-sheet-setup.md # Sheet setup guide
Set the environment variable:
bash
export JOB_TRACKER_SPREADSHEET_ID="your-google-sheet-id"
Install gog CLI:
bash
brew install steipete/tap/gogcli
Authenticate gog with Sheets access:
bash
gog auth add your@gmail.com --services sheets
Fix executable permission:
bash
chmod +x /path/to/skills/jobs-hunter-claw/scripts/job-tracker.sh
Use the full channel format: channel:CHANNEL_ID (not just discord).
google/gemini-flash-latest as required model for cost efficiencydelete command for removing jobs; uses gog sheets clear for proper row clearingJOB_TRACKER_SPREADSHEET_ID env var