The problem
Job searching for a niche role — remote GRC / compliance-automation engineering — means checking a rotating set of job boards and company pages every few days, most of which don’t have decent RSS feeds or alerts that actually match what you’re looking for.
What it does
job_scout.py uses the Anthropic API with the web search tool, given a natural-language SEARCH_CRITERIA block that describes target roles and my candidate profile (GRC/compliance automation, policy-as-code, GRC platforms like Vanta/Drata/ServiceNow GRC/OneTrust, remote-first, no hard CISA/CISSP requirement). It searches, filters, and summarizes matching postings, then emails me the results and logs a running history to job_scout_log.md.
Architecture
- Search engine: Anthropic SDK (Claude) + the web search tool
- Scheduling: GitHub Actions cron (
.github/workflows/job_scout.yml), currently weekly - Delivery: Gmail SMTP via an app password (Google blocks plain password SMTP auth)
- Logging: results are appended to a markdown log and committed back to the repo automatically on every run
- Cost tracking: per-run token usage and cost are calculated against current Claude pricing, with a running month-to-date total and a self-imposed monthly budget cap
Notable gotchas
Getting the cron schedule right took a couple of iterations — three separate things can cause “extra” runs beyond your cron schedule: leftover manual workflow_dispatch triggers, edits made off the default branch, and a duplicate workflow file sitting in .github/workflows/.
What’s next
Adding a provider-abstraction layer (mirroring the pattern from my Flask migration-validation tool’s ai_assistant/ package) so the script isn’t locked to a single LLM provider — an LLM_PROVIDER environment variable will switch between Anthropic, OpenAI, and Gemini, with normalized cost tracking across all three.