yc-jobs-scraper — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited yc-jobs-scraper (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill provides a robust architecture for scraping jobs from YCombinator and workatastartup.com. It is designed to run automatically, bypass login bottlenecks, and maintain state to never scrape duplicate jobs.
The scraper uses a hybrid approach to maximize reliability and minimize bot detection:
scripts/auth.js uses Playwright to let a human log in once and saves the session to scripts/state.json.scripts/db.js uses better-sqlite3 to manage scripts/jobs.db. It tracks every company_slug and job_id ever seen.scripts/scraper.js loads state.json, visits YC query URLs, and extracts company slugs from the hidden Inertia.js data-page JSON payload./companies/[slug]) to extract jobs from the backend JSON payload to ensure we get the real job_id for accurate deduplication.ycombinator.com/companies/[slug]/jobs.If this is the first time running the scraper in an environment, or if node_modules is missing:
cd @path/scripts
npm install
npx playwright installIf scripts/state.json is missing or expired, the scraper will fail. You must instruct the human user to run the authentication script manually:
cd @path/scripts
node auth.jsTell the user a browser will open, and they must log in. Playwright will automatically save the cookies/tokens to state.json.
To scrape for new companies and jobs:
cd @path/scripts
node scraper.jsThis script will output exactly how many new companies and new jobs were found. Because of jobs.db, running it multiple times consecutively will result in 0 new jobs found.
If you need to analyze the scraped data or view the companies/jobs, you can query scripts/jobs.db directly using better-sqlite3.
Example: Count Companies
cd @path/scripts
node -e "const db = require('better-sqlite3')('jobs.db'); console.log('Companies:', db.prepare('SELECT COUNT(*) as count FROM companies').get().count);"Example: View Recent Jobs
cd @path/scripts
node -e "const db = require('better-sqlite3')('jobs.db'); const jobs = db.prepare('SELECT title, company_slug, location FROM jobs ORDER BY created_at DESC LIMIT 5').all(); console.table(jobs);"~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.