Skip to content

outscal/OpenJobs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Outscal-Jobs

Fork notice: This project is a fork of santifer/career-ops maintained by Outscal. MIT-licensed, with all original attribution to Santiago Fernández preserved. The upstream repository remains the source of truth for the core career-ops system; this fork adds a multi-ATS job-harvesting layer on top of it. See Changes in This Fork below, and Staying in Sync with Upstream for how upstream updates are pulled.

English | Español | Português (Brasil) | 한국어 | 日本語 | Русский | 繁體中文

Career-Ops — Multi-Agent Job Search System

I spent months applying to jobs the hard way. So I engineered the system I wish I had.
Companies use AI to filter candidates. I gave candidates AI to choose companies.
Now it's open source.

Claude Code OpenCode Codex Node.js Go Playwright MIT Discord
EN ES DE FR PT-BR KO JA ZH-TW


Career-Ops Demo

740+ job listings evaluated · 100+ personalized CVs · 1 dream role landed

Discord

What Is This

Career-Ops turns any AI coding CLI into a full job search command center. Instead of manually tracking applications in a spreadsheet, you get an AI-powered pipeline that:

  • Evaluates offers with a structured A-F scoring system (10 weighted dimensions)
  • Generates tailored PDFs -- ATS-optimized CVs customized per job description
  • Scans portals automatically (Greenhouse, Ashby, Lever, company pages)
  • Processes in batch -- evaluate 10+ offers in parallel with sub-agents
  • Tracks everything in a single source of truth with integrity checks

Important: This is NOT a spray-and-pray tool. Career-ops is a filter -- it helps you find the few offers worth your time out of hundreds. The system strongly recommends against applying to anything scoring below 4.0/5. Your time is valuable, and so is the recruiter's. Always review before submitting.

Career-ops is agentic: Claude Code navigates career pages with Playwright, evaluates fit by reasoning about your CV vs the job description (not keyword matching), and adapts your resume per listing.

Heads up: the first evaluations won't be great. The system doesn't know you yet. Feed it context -- your CV, your career story, your proof points, your preferences, what you're good at, what you want to avoid. The more you nurture it, the better it gets. Think of it as onboarding a new recruiter: the first week they need to learn about you, then they become invaluable.

Built by someone who used it to evaluate 740+ job offers, generate 100+ tailored CVs, and land a Head of Applied AI role. Read the full case study.

Changes in This Fork

Outscal-Jobs keeps every feature of upstream career-ops (JD evaluation, PDF generation, tracker, portal scan, pipeline, batch, dashboard) and adds a multi-ATS job-harvesting layer targeted at Outscal's production dataset of ~12K gaming/tech/AI companies.

Added What it does
harvest.mjs Multi-ATS harvester. Reads data/companies.json, routes each company through the adapter registry, fetches live job listings, and emits output/jobs-YYYY-MM-DD.csv + output/jobs-manual-YYYY-MM-DD.csv.
adapters/ 13 ATS adapters with a common detect() / fetchJobs() interface: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Workday, Teamtailor, Recruitee, Personio, Breezy, BambooHR, Jobvite, Join.com.
probe-ats.mjs Slug-probes un-routed companies against public slug-based ATS APIs to find boards that ats_links in the dataset missed — used to expand the reachable company set beyond what the dataset already marked. See Expanding the Company Dataset.
merge-probe-hits.mjs Applies probe-ats.mjs output back to data/companies.json — appends newly-discovered ATS URLs to each company's ats_links so harvest.mjs can route them. Default dry-run, writes a backup before modifying the source.
data/companies.json Outscal's production dataset: 12,144 company records with type, ats_links, industry_category, tech_stack, and other metadata. Currently ~2,100 of these route to a working ATS adapter (up from the original 1,480 after the initial probe sweep).
/outscal-jobs slash command Renamed from /career-ops (skill lives at .claude/skills/outscal-jobs/SKILL.md). Both names continue to work. Full flag reference there.

What's unchanged: the upstream career-ops modes, scoring logic (A–G blocks), PDF template, dashboard TUI, batch runners, pipeline integrity checks, and update-system infrastructure all remain intact and keep receiving upstream updates via update-system.mjs.

Quick Start: Harvest Gaming Jobs

Two ways to run the harvester — whichever is more convenient.

Option A: Slash command (inside Claude Code / OpenCode)

Open the repo in Claude Code (or OpenCode) and type:

/outscal-jobs harvest --industry gaming

That's it. The AI runs the harvester, filters to gaming companies only, and tells you where the CSV landed.

Useful variants of the same command:

Slash command What it does
/outscal-jobs harvest --industry gaming Gaming companies only
/outscal-jobs harvest --industry tech Tech companies only
/outscal-jobs harvest --industry gaming --country india Gaming + India-based roles
/outscal-jobs harvest --industry gaming --ats greenhouse Gaming + only Greenhouse-hosted
/outscal-jobs harvest --limit 50 --dry-run Quick smoke test — count only, no CSV
/outscal-jobs harvest Full harvest across all 2,100+ routable companies, using portals.yml filters

The full flag list and more modes (evaluation, PDF generation, tracker, etc.) live in .claude/skills/outscal-jobs/SKILL.md. Run /outscal-jobs with no arguments to see the whole menu.

Option B: Plain Node CLI (no Claude Code required)

# Gaming companies only
node harvest.mjs --industry gaming

# Gaming + geography filter
node harvest.mjs --industry gaming --country india

# Single company
node harvest.mjs --company "Riot Games"

# Dry-run — count what would be fetched, no CSV written
node harvest.mjs --industry gaming --dry-run

Outputs:

  • output/jobs-YYYY-MM-DD.csv — the harvested job listings (this is the file you want).
  • output/jobs-manual-YYYY-MM-DD.csv — companies hosted on LinkedIn/Wellfound and similar, flagged for manual review.

Filter behavior is defined in portals.yml (title keywords, location include/exclude). CLI flags override portals.yml when both are set.

Expanding the Company Dataset

Over time, some companies in data/companies.json (~12K rows) gain a public ATS board — or had one we didn't catch at ingest. Two scripts keep the harvest.mjs-reachable set (currently ~2,100 companies) growing:

# 1. Discover: slug-probe the un-routed companies against 7 public ATS APIs
#    (Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Breezy, BambooHR).
#    Output: output/ats-probe-YYYY-MM-DD.csv
node probe-ats.mjs

# 2. Review the CSV by hand — sort by matched_ats and eyeball sample_title for
#    collisions (short slugs on common words can false-positive).

# 3. Dry-run merge — see what would be added to companies.json, no file changes
node merge-probe-hits.mjs --csv output/ats-probe-YYYY-MM-DD.csv

# 4. Apply the merge — backup is written automatically
node merge-probe-hits.mjs --csv output/ats-probe-YYYY-MM-DD.csv --write

Full sweep of ~10K un-routed companies takes ~40 minutes on a typical connection. Workable and Personio are skipped by default because they IP-rate-limit aggressively; re-enable them in probe-ats.mjs (PER_ATS_MAX) if you want to probe them as a separate slow pass.

The merge script is idempotent — re-running it skips URLs already present — so it's safe to run as often as you want.

Staying in Sync with Upstream

Two paths are available, not mutually exclusive.

Path 1: update-system.mjs (works out of the box — no setup required)

node update-system.mjs check      # see if a new upstream version is published
node update-system.mjs apply      # apply only system-layer files — your data is never touched
node update-system.mjs rollback   # undo the last update

This is a santifer-designed auto-updater that pulls ONLY generic system-layer files (modes, PDF scripts, dashboard, templates) from santifer/career-ops. The upstream repository URL is hardcoded inside the script — so anyone who clones this fork gets the sync mechanism immediately with zero git configuration. User-layer files (cv.md, config/profile.yml, modes/_profile.md, data/, reports/, output/) and fork-specific files (harvest.mjs, adapters/, probe-ats.mjs, data/companies.json) are never overwritten. CLAUDE.md also instructs the AI to run update-system.mjs check silently on the first message of each session, so upstream updates surface automatically.

Path 2: Git upstream remote (for visibility and cherry-picking)

Git remotes are not copied during git clone, so you need to add the upstream remote manually once after cloning:

git remote add upstream https://github.com/santifer/career-ops.git
git remote set-url --push upstream DISABLED   # safety: prevent accidental pushes to upstream
git fetch upstream

After that, you can explore upstream:

git log upstream/main --oneline             # see what santifer has released
git show upstream/<sha> -- path/to/file     # preview a specific upstream change
git cherry-pick <sha>                       # selectively apply an upstream commit

Direct git merge upstream/main is not recommended — this fork's git history is a clean initial commit and does not share history with upstream, so merges would require --allow-unrelated-histories and produce large conflicts. Use update-system.mjs for routine updates, or manual cherry-picks when you want to pull a specific upstream change.

Features

Feature Description
Auto-Pipeline Paste a URL, get a full evaluation + PDF + tracker entry
6-Block Evaluation Role summary, CV match, level strategy, comp research, personalization, interview prep (STAR+R)
Interview Story Bank Accumulates STAR+Reflection stories across evaluations -- 5-10 master stories that answer any behavioral question
Negotiation Scripts Salary negotiation frameworks, geographic discount pushback, competing offer leverage
ATS PDF Generation Keyword-injected CVs with Space Grotesk + DM Sans design
Portal Scanner 45+ companies pre-configured (Anthropic, OpenAI, ElevenLabs, Retool, n8n...) + custom queries across Ashby, Greenhouse, Lever, Wellfound
Batch Processing Parallel evaluation with claude -p workers
Dashboard TUI Terminal UI to browse, filter, and sort your pipeline
Human-in-the-Loop AI evaluates and recommends, you decide and act. The system never submits an application -- you always have the final call
Pipeline Integrity Automated merge, dedup, status normalization, health checks

Quick Start

# 1. Clone and install
git clone https://github.com/santifer/career-ops.git
cd career-ops && npm install
npx playwright install chromium   # Required for PDF generation

# 2. Check setup
npm run doctor                     # Validates all prerequisites

# 3. Configure
cp config/profile.example.yml config/profile.yml  # Edit with your details
cp templates/portals.example.yml portals.yml       # Customize companies

# 4. Add your CV
# Create cv.md in the project root with your CV in markdown

# 5. Personalize with Claude
claude   # Open Claude Code in this directory

# Then ask Claude to adapt the system to you:
# "Change the archetypes to backend engineering roles"
# "Translate the modes to English"
# "Add these 5 companies to portals.yml"
# "Update my profile with this CV I'm pasting"

# 6. Start using
# Paste a job URL or run /career-ops

The system is designed to be customized by Claude itself. Modes, archetypes, scoring weights, negotiation scripts -- just ask Claude to change them. It reads the same files it uses, so it knows exactly what to edit.

See docs/SETUP.md for the full setup guide.

Usage

Career-ops is a single slash command with multiple modes:

/career-ops                → Show all available commands
/career-ops {paste a JD}   → Full auto-pipeline (evaluate + PDF + tracker)
/career-ops scan           → Scan portals for new offers
/career-ops pdf            → Generate ATS-optimized CV
/career-ops batch          → Batch evaluate multiple offers
/career-ops tracker        → View application status
/career-ops apply          → Fill application forms with AI
/career-ops pipeline       → Process pending URLs
/career-ops contacto       → LinkedIn outreach message
/career-ops deep           → Deep company research
/career-ops training       → Evaluate a course/cert
/career-ops project        → Evaluate a portfolio project

Or just paste a job URL or description directly -- career-ops auto-detects it and runs the full pipeline.

How It Works

You paste a job URL or description
        │
        ▼
┌──────────────────┐
│  Archetype       │  Classifies: LLMOps / Agentic / PM / SA / FDE / Transformation
│  Detection       │
└────────┬─────────┘
         │
┌────────▼─────────┐
│  A-F Evaluation  │  Match, gaps, comp research, STAR stories
│  (reads cv.md)   │
└────────┬─────────┘
         │
    ┌────┼────┐
    ▼    ▼    ▼
 Report  PDF  Tracker
  .md   .pdf   .tsv

Pre-configured Portals

The scanner comes with 45+ companies ready to scan and 19 search queries across major job boards. Copy templates/portals.example.yml to portals.yml and add your own:

AI Labs: Anthropic, OpenAI, Mistral, Cohere, LangChain, Pinecone Voice AI: ElevenLabs, PolyAI, Parloa, Hume AI, Deepgram, Vapi, Bland AI AI Platforms: Retool, Airtable, Vercel, Temporal, Glean, Arize AI Contact Center: Ada, LivePerson, Sierra, Decagon, Talkdesk, Genesys Enterprise: Salesforce, Twilio, Gong, Dialpad LLMOps: Langfuse, Weights & Biases, Lindy, Cognigy, Speechmatics Automation: n8n, Zapier, Make.com European: Factorial, Attio, Tinybird, Clarity AI, Travelperk

Job boards searched: Ashby, Greenhouse, Lever, Wellfound, Workable, RemoteFront

Dashboard TUI

The built-in terminal dashboard lets you browse your pipeline visually:

cd dashboard
go build -o career-dashboard .
./career-dashboard --path ..

Features: 6 filter tabs, 4 sort modes, grouped/flat view, lazy-loaded previews, inline status changes.

Project Structure

career-ops/
├── CLAUDE.md                    # Agent instructions
├── cv.md                        # Your CV (create this)
├── article-digest.md            # Your proof points (optional)
├── config/
│   └── profile.example.yml      # Template for your profile
├── modes/                       # 14 skill modes
│   ├── _shared.md               # Shared context (customize this)
│   ├── oferta.md                # Single evaluation
│   ├── pdf.md                   # PDF generation
│   ├── scan.md                  # Portal scanner
│   ├── batch.md                 # Batch processing
│   └── ...
├── templates/
│   ├── cv-template.html         # ATS-optimized CV template
│   ├── portals.example.yml      # Scanner config template
│   └── states.yml               # Canonical statuses
├── batch/
│   ├── batch-prompt.md          # Self-contained worker prompt
│   └── batch-runner.sh          # Orchestrator script
├── dashboard/                   # Go TUI pipeline viewer
├── data/                        # Your tracking data (gitignored)
├── reports/                     # Evaluation reports (gitignored)
├── output/                      # Generated PDFs (gitignored)
├── fonts/                       # Space Grotesk + DM Sans
├── docs/                        # Setup, customization, architecture
└── examples/                    # Sample CV, report, proof points

Tech Stack

Claude Code Node.js Playwright Go Bubble Tea

  • Agent: Claude Code with custom skills and modes
  • PDF: Playwright/Puppeteer + HTML template
  • Scanner: Playwright + Greenhouse API + WebSearch
  • Dashboard: Go + Bubble Tea + Lipgloss (Catppuccin Mocha theme)
  • Data: Markdown tables + YAML config + TSV batch files

Also Open Source

  • cv-santiago -- The portfolio website (santifer.io) with AI chatbot, LLMOps dashboard, and case studies. If you need a portfolio to showcase alongside your job search, fork it and make it yours.

About the Author

I'm Santiago -- Head of Applied AI, former founder (built and sold a business that still runs with my name on it). I built career-ops to manage my own job search. It worked: I used it to land my current role.

My portfolio and other open source projects → santifer.io

Buy me a coffee if career-ops helped your job search.

Star History

Star History Chart

Disclaimer

career-ops is a local, open-source tool — NOT a hosted service. By using this software, you acknowledge:

  1. You control your data. Your CV, contact info, and personal data stay on your machine and are sent directly to the AI provider you choose (Anthropic, OpenAI, etc.). We do not collect, store, or have access to any of your data.
  2. You control the AI. The default prompts instruct the AI not to auto-submit applications, but AI models can behave unpredictably. If you modify the prompts or use different models, you do so at your own risk. Always review AI-generated content for accuracy before submitting.
  3. You comply with third-party ToS. You must use this tool in accordance with the Terms of Service of the career portals you interact with (Greenhouse, Lever, Workday, LinkedIn, etc.). Do not use this tool to spam employers or overwhelm ATS systems.
  4. No guarantees. Evaluations are recommendations, not truth. AI models may hallucinate skills or experience. The authors are not liable for employment outcomes, rejected applications, account restrictions, or any other consequences.

See LEGAL_DISCLAIMER.md for full details. This software is provided under the MIT License "as is", without warranty of any kind.

Contributors

Got hired using career-ops? Share your story!

License

MIT

Let's Connect

Website LinkedIn X Discord Email Buy Me a Coffee

About

Harvest growth/tech jobs from 2,000+ gaming/tech companies via public ATS APIs into CSV. Fork of santifer/career-ops with Outscal harvester layer.

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors