Scraper Agent Overview
The scraper agent is responsible for collecting job descriptions and handing them off to the rest of the resume pipeline.
In this system, the scraper agent runs as its own Hermes profile so it stays isolated from the resume agent. That separation makes it easier to manage scraping-specific prompts, runtime values, schedules, and ingestion logic without affecting resume generation directly.
Available scrapers
The scraper implementation in this repository is built around two scraper scripts with different tradeoffs:
jobrightscraper: free, but only scrapes jobs from Jobrighttinyfishscraper: paid, requires a Tiny Fish API key, but can fetch content from general job-description URLs outside Jobright
Both implementations are available in the public repository under scraper/:
scraper/jobright.pyscraper/tiny_fish_job_description.py
You are not limited to these two scrapers. You can also build your own scraper as long as it collects the required job data and pushes it into the backend in the format expected by the rest of the system.
How the scraper flow works
The operating model is straightforward:
- the scraper agent runs in its own Hermes profile, usually on a morning cron
- it collects a batch of jobs
- it stores those jobs in the dashboard/backend queue
- the resume agent later fetches unused jobs from that database and runs the resume pipeline on them
This makes the scraper agent the ingestion layer for the whole system. Its job is not to generate resumes. Its job is to continuously keep the job queue fresh, structured, and ready for downstream processing.
Normal ways to use it
There are two normal operating modes:
- manual run: ask the scraper Hermes profile to scrape a batch now
- scheduled run: let cron invoke the scraper profile automatically
Recommended operator pattern:
- keep the scraper in a dedicated Hermes profile such as
scraper - add a scraper skill in that profile that maps prompts like
scrape 20 jobsto the correct script invocation - keep the scraper scripts and env template from this repository available inside that scraper profile's workspace
- keep the resume pipeline in a separate Hermes profile such as
resume
That separation is intentional. The scraper profile owns browser automation, scraping credentials, ingest secrets, and cron scheduling. The resume profile owns candidate truth, evidence selection, resume generation, and dashboard resume pushes.
Current scraper-side assets in this repository are:
scraper/jobright.pyscraper/tiny_fish_job_description.pyscraper/.env.example- the documented pattern for a scraper-profile wrapper skill
Jobright vs Tiny Fish
Use jobright.py when:
- you want a free source of jobs
- you are specifically scraping Jobright recommendations
- you want to ingest batches directly into the dashboard queue
Use tiny_fish_job_description.py when:
- you already have a specific job URL
- the job is not on Jobright
- you are willing to pay for Tiny Fish API access
Important limitation:
tiny_fish_job_description.pyfetches page content and saves Markdown locallyjobright.pyis the scraper that currently logs in, collects jobs, and posts them into the dashboard ingest endpoint
VPS and headless note
The current Jobright scraper should not be treated as a true headless scraper. In the repository it runs with browser automation and headless=False.
For VPS use:
- run it on a VPS where Hermes is installed in the dedicated scraper profile
- use a virtual display such as
Xvfb - invoke the script with
--xvfbso the browser has a display context
If you want always-on automation, the VPS setup is the right place for the scraper agent. Local runs are fine for testing, but cron-based scraping belongs on the scraper profile's VPS environment.
Backend integration
To make this work in your own setup, you will need backend endpoints for storing scraped jobs, marking job state, and serving unused jobs back to the resume agent. Those backend contracts are documented in the API reference:
If you want the actual scraper files referenced in this section, use the public source repository.
hermes-autonomous-resume on GitHub