Reading this dashboard — for everyone
- Every number on this page comes from real job postings, read directly from
each company's own job board (Ashby, Greenhouse, or Workday). Nothing is scraped
from web pages and nothing is estimated.
- The filter bar controls the whole page. Type in the search box or pick a
category or company, and every chart, count, and table row updates together.
- Your target roles counts postings whose title matches each saved
role keyword. Words like "senior" or "staff" are ignored, so
"Sr. Engineering Manager, Data Platform" still counts as "engineering manager".
Click a role to see only those postings.
- Click any row in the postings table to read the job posting in a side panel.
The Apply link always opens the company's own page.
- Salary charts use only pay ranges that companies published themselves, in US
dollars. A "band" is the low-to-high range a company lists; the "midpoint" is the
middle of that range. Postings with no published pay are left out of salary
charts — never guessed.
- Postings are grouped into nine job categories based on each posting's
department (or its title when the board sends no department). Anything that does
not match a rule goes to "Other".
- Some boards do not share posting dates (for example Lime and NVIDIA). Those
postings appear everywhere except the weekly chart. Greenhouse dates mean
"last updated", not "first posted". Weeks start on Monday (UTC).
- Job-description text belongs to the hiring companies. It is shown here for
personal job-search use — not included in this
build.
Using the data — for analysts & data engineers
- The dataset behind this page is a public parquet file, rebuilt every day at
11:00 UTC. It holds facts only — titles, companies, locations, pay bands — and
never job-description text.
- Query it straight from DuckDB; no download or account needed:
SELECT category, count(*) AS jobs
FROM 'https://raw.githubusercontent.com/senthilsweb/ai-agents/main/agents/job-scout/data/ats_raw_trends.parquet'
GROUP BY 1 ORDER BY 2 DESC;
- Need an older day? Replace
main in the URL with a date tag such as
trends/20260714. One tag is created per daily publish.
- Column guide (full version with more example queries:
agents/job-scout/data/README.md in the repo):
| company_name | company that published the posting |
| ats_platform | job-board system: ashby, greenhouse, or workday |
| req_id | the posting's id on that board; company + req_id is unique |
| title | job title, exactly as published |
| department, team | as published; empty when the board sends none |
| employment_type | FullTime, Contract… when the board shares it |
| location | free text, exactly as published |
| work_mode | remote / hybrid / onsite when the board shares it |
| comp_summary | the pay text exactly as published, e.g. "$165K – $216K" |
| posted_date | date from the feed; empty for boards that send none |
| apply_url | link to the posting |
| fetched_at | when the pipeline read the posting |
| industry, classification | company tags from the pipeline's own list; may be empty |
| category | the nine-bucket grouping used on this page |
| base_min_usd, base_max_usd | pay band parsed to numbers; USD only, empty otherwise |
Run it yourself — for developers
- Everything is open source:
github.com/senthilsweb/ai-agents
→
agents/job-scout.
- One command runs the whole pipeline (fetch boards → export parquet → build
this page):
docker run --rm ghcr.io/senthilsweb/job-scout trends
- Put your own role keywords in
config.yaml under
targets.title_keywords and rebuild — the "Your target roles" panel
follows your list.
- This page is a single self-contained HTML file rendered by
tools/build_trends_report.py from the parquet. No server, no
external requests.