freshcrate
Home > MCP Servers > JobForge

JobForge

AI-powered job search automation — evaluate offers, generate ATS-optimized CVs, scan portals, negotiate, and track applications. One config drives OpenCode, Cursor, Claude Code, and Codex. Free end-to

Description

AI-powered job search automation — evaluate offers, generate ATS-optimized CVs, scan portals, negotiate, and track applications. One config drives OpenCode, Cursor, Claude Code, and Codex. Free end-to-end via OpenCode + Geometra MCP.

README

JobForge

AI-powered job search pipeline built on opencode. Evaluate offers, generate tailored CVs, scan portals, negotiate offers, and track everything -- powered by AI agents.

opencodeNode.jsGeometraLicense: MIT Made in USA JobForge Demo

Paste a job URL. Get a scored evaluation, tailored CV, and tracked application — in seconds.


Quick Start

npx --package=job-forge create-job-forge my-job-search
cd my-job-search
npm install
opencode

The scaffolded opencode.json already has the Geometra MCP (browser automation + PDF) and Gmail MCP (reading replies) wired up — they launch automatically the first time opencode starts. npm install also materializes symlinks for every supported agent harness — OpenCode, Cursor, Claude Code, and Codex — so you can run opencode, cursor, claude, or codex in the same project and each picks up the shared MCP config and instructions.

Then fill in cv.md, config/profile.yml, and portals.yml with your personal data, paste a job URL into opencode, and JobForge evaluates + tracks it.

Upgrade later: npm run update-harness (pulls latest job-forge from npm, re-syncs symlinks, prints the resolved version)

Full setup guide and alternative install paths (including contributing to the harness itself): docs/SETUP.md.


What Is This

JobForge turns opencode 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 unified 10-dimension weighted scoring system
  • Generates tailored PDFs -- ATS-optimized CVs with anti-AI-detection writing rules
  • Scans portals with fuzzy dedup (catches reposts with new URLs)
  • Processes in batch -- evaluate 10+ offers in parallel with sub-agents
  • Tracks everything with pipeline integrity checks and canonical state management
  • Manages follow-ups -- timing-based nudges so you never miss a window
  • Learns from rejections -- pattern analysis across all rejections by stage, archetype, and score
  • Negotiates offers -- structured comp breakdown, leverage assessment, counter-offer strategy

Important: This is NOT a spray-and-pray tool. The whole point is to apply only where there's a real match. The scoring system helps you focus on high-fit opportunities instead of wasting everyone's time. Always review before submitting.

Features

Feature Description
Auto-Pipeline Paste a URL, get a full evaluation + PDF + tracker entry
Unified Scoring 10 weighted dimensions, consistent across all modes, with calibration anchors
Anti-AI-Detection CVs Writing rules that avoid ATS filters on Indeed, LinkedIn, Workday
6-Block Evaluation Role summary, CV match, level strategy, comp research, personalization, interview prep (STAR+R)
Interview Story Bank Curated bank of 10-12 stories with match counts, archetype tags, and automatic pruning
Follow-Up System Timing-based nudges: Applied 7+ days ago nudge, Interviewed 1 day ago thank-you note, email scanning via Gmail MCP
Gmail Integration MCP server configured to retrieve emails for interview callbacks, offer responses, and application status updates
Rejection Analysis Captures stage + reason, surfaces patterns (archetype gaps, scoring miscalibration)
Offer Negotiation Total comp breakdown, equity valuation, leverage from pipeline, counter-offer scripts
Deep Research Company research that feeds back into scores and interview prep
Smart LinkedIn Outreach Reads evaluation reports to craft targeted messages using top proof points
Portal Scanner 45+ companies pre-configured with fuzzy dedup for reposts
Batch Processing Parallel evaluation with opencode run workers, with honest verification flagging
Pipeline Integrity Automated merge, dedup, status normalization, health checks
Cost-Aware Agent Routing Three subagents (@general-free, @general-paid, @glm-minimal) with per-task model tiers. On OpenCode, JobForge mixes native free models with free OpenRouter routes so the harness stays no-cost without forcing every task through the same provider. See Subagent Routing in AGENTS.md for the task-to-agent mapping.
Automatic Model Fallback When a model rate-limits or 5xx's, @razroo/opencode-model-fallback rotates the agent through a configured fallback_models chain and replays the request. JobForge's OpenCode defaults stay on free models for both primaries and fallbacks.
Token Cost Visibility job-forge tokens --days 1 for per-session breakdown; job-forge session-report --since-minutes 60 --log to flag sessions over budget and append history to data/token-usage.tsv. Auto-logged after every batch run.

Usage

/job-forge                → Show all available commands
/job-forge {paste a JD}   → Full auto-pipeline (evaluate + PDF + tracker)
/job-forge scan           → Scan portals for new offers
/job-forge pdf            → Generate ATS-optimized CV
/job-forge batch          → Batch evaluate multiple offers
/job-forge tracker        → View application status
/job-forge apply          → Fill application forms with AI
/job-forge pipeline       → Process pending URLs
/job-forge contact        → LinkedIn outreach (uses evaluation report)
/job-forge deep           → Deep company research (feeds back into scores)
/job-forge followup       → Check what needs follow-up action
/job-forge rejection      → Record/analyze rejection patterns
/job-forge negotiation    → Structured offer negotiation
/job-forge training       → Evaluate a course/cert
/job-forge project        → Evaluate a portfolio project

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

The system is designed to be customized by opencode itself. Modes, archetypes, scoring weights, negotiation scripts -- just ask opencode to change them: "Change the archetypes to backend engineering roles", "Add these 5 companies to portals.yml", "Update my profile with this CV I'm pasting".

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)    │  Unified 10-dimension scoring model
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
         │
    ā”Œā”€ā”€ā”€ā”€ā”¼ā”€ā”€ā”€ā”€ā”
    ā–¼    ā–¼    ā–¼
 Report  PDF  Tracker
  .md   .pdf   .tsv
         │
    ā”Œā”€ā”€ā”€ā”€ā”¼ā”€ā”€ā”€ā”€ā”
    ā–¼    ā–¼    ā–¼
 Apply  Follow  Negotiate
        up      (if offer)

Project Structure

Your personal project (after npx --package=job-forge create-job-forge my-search):

my-search/
ā”œā”€ā”€ package.json                  # depends on "job-forge": "^2.0.0" (npm registry)
ā”œā”€ā”€ opencode.json                 # thin config — enables MCPs + states.yml
ā”œā”€ā”€ cv.md                         # your CV (personal)
ā”œā”€ā”€ article-digest.md             # your proof points (optional, personal)
ā”œā”€ā”€ portals.yml                   # companies to scan (personal)
ā”œā”€ā”€ config/profile.yml            # your identity, target roles (personal)
ā”œā”€ā”€ data/                         # applications, pipeline, scan history (personal, gitignored)
ā”œā”€ā”€ reports/                      # generated evaluation reports (personal, gitignored)
ā”œā”€ā”€ batch/{batch-input,batch-state}.tsv, tracker-additions/, logs/   # personal
ā”œā”€ā”€ AGENTS.md                     # personal overrides (opencode + codex)
ā”œā”€ā”€ CLAUDE.md                     # personal overrides (Claude Code), @-imports CLAUDE.harness.md
│
│ # ↓ symlinks into node_modules/job-forge/, regenerated by postinstall sync.mjs
ā”œā”€ā”€ AGENTS.harness.md             # → harness instructions (loaded via opencode.json)
ā”œā”€ā”€ CLAUDE.harness.md             # → harness instructions (imported from personal CLAUDE.md)
ā”œā”€ā”€ .mcp.json                     # → Claude Code MCP config
ā”œā”€ā”€ .codex/config.toml            # → Codex MCP config
ā”œā”€ā”€ .cursor/mcp.json              # → Cursor MCP config
ā”œā”€ā”€ .cursor/rules/main.mdc        # → Cursor always-apply rule
ā”œā”€ā”€ .opencode/skills/job-forge.md # → skill router
ā”œā”€ā”€ .opencode/agents/             # → @general-free, @general-paid, @glm-minimal
ā”œā”€ā”€ modes/                        # → _shared.md + skill modes
ā”œā”€ā”€ templates/                    # → states.yml, portals.example.yml, cv-template.html
ā”œā”€ā”€ batch/batch-prompt.md         # → batch worker prompt
ā”œā”€ā”€ batch/batch-runner.sh         # → parallel orchestrator
│
└── node_modules/job-forge/       # the harness (from npm: `job-forge@2.x`)

Symlinks are regenerated on every npm install via the package's postinstall hook. You never have to know about harness internals — just edit cv.md, portals.yml, and config/profile.yml.

The harness itself (this repo, what gets published as job-forge on npm):

JobForge/
ā”œā”€ā”€ iso/                          # ← SOURCE OF TRUTH for harness configuration
│   ā”œā”€ā”€ instructions.md           # → AGENTS.md + CLAUDE.md (Claude Code / Codex / Cursor)
│   ā”œā”€ā”€ mcp.json                  # → .mcp.json + .cursor/mcp.json + .codex/config.toml + opencode.json
│   ā”œā”€ā”€ agents/*.md               # → .opencode/agents/*.md (general-free, general-paid, glm-minimal)
│   ā”œā”€ā”€ commands/job-forge.md     # → .opencode/skills/job-forge.md
│   └── config.json               # per-harness top-level extras (e.g. opencode `instructions` array)
│
ā”œā”€ā”€ package.json                  # bin: job-forge, create-job-forge; prepack runs iso-harness
ā”œā”€ā”€ bin/
│   ā”œā”€ā”€ job-forge.mjs             # CLI dispatcher (merge/verify/pdf/tokens/sync/...)
│   ā”œā”€ā”€ sync.mjs                  # postinstall: creates symlinks in consumer project
│   └── create-job-forge.mjs      # scaffolder
ā”œā”€ā”€ modes/                        # _shared.md + 16 skill modes
ā”œā”€ā”€ templates/                    # cv-template.html, portals.example.yml, states.yml
ā”œā”€ā”€ config/profile.example.yml    # template for consumer's profile.yml
ā”œā”€ā”€ batch/{batch-prompt.md,batch-runner.sh}   # batch orchestrator
ā”œā”€ā”€ scripts/
│   ā”œā”€ā”€ token-usage-report.mjs    # opencode cost analyzer
│   └── release/check-source.mjs  # version gate for npm publish
ā”œā”€ā”€ tracker-lib.mjs / merge-tracker.mjs / dedup-tracker.mjs / verify-pipeline.mjs
ā”œā”€ā”€ normalize-statuses.mjs / generate-pdf.mjs / cv-sync-check.mjs
ā”œā”€ā”€ dashboard/                    # optional Go TUI
ā”œā”€ā”€ fonts/                        # Space Grotesk + DM Sans (for PDF)
ā”œā”€ā”€ docs/                         # architecture, setup, customization
└── .github/workflows/            # quality.yml + release.yml (CI publish to npm)

All per-harness config trees (.opencode/, .cursor/, .claude/, .codex/, CLAUDE.md, AGENTS.md, .mcp.json, opencode.json) are generated from iso/ by @razroo/iso-harness and gitignored in this repo. npm run build:config regenerates them locally; prepack regenerates them into the tarball at publish time so consumers get everything pre-baked.

Documentation

Index and cross-links: docs/README.md.

  • Setup — both install paths, profile, CV, portals, verify, token tracking, troubleshooting
  • Architecture — package architecture, modes, evaluation flow, batch runner, pipeline scripts
  • Customization — archetypes, scanner keywords, CV template, states, customizing symlinked modes
  • Model Routing — the three cost-tiered subagents, why the architecture exists, and how to swap models or add your own
  • Contributing — branch workflow, quality gate, and ideas for PRs

License

MIT

Release History

VersionChangesUrgencyDate
v2.14.4**Full Changelog**: https://github.com/razroo/JobForge/compare/v2.14.3...v2.14.4High4/21/2026
v2.14.3- route OpenCode @general-free to opencode/big-pickle\n- move free-tier fallbacks away from minimax schema drift\n- refresh model routing docs for mixed native/free-provider defaultsHigh4/21/2026
v2.14.2Tightens OpenCode behavior when OpenRouter returns **\[Venice\] insufficient USD/Diem** style errors while still on `@general-paid` (free model ids). - **`@general-paid` `fallback_models`:** `gpt-oss-120b:free` is now first after the primary (often a different backend than the immediate Venice pool), then nemotron → GLM → qwen3-coder → gemma-4-31b → llama-3.3-70b — **six** free-only hops after the primary. - **`opencodeModelFallback.retryable_error_patterns`:** broader substring-style patterns High4/20/2026
v2.14.1## OpenCode: model fallback config now authored in `iso/` Global `@razroo/opencode-model-fallback` settings live in **`iso/config.json` → `opencodeModelFallback`**. `@razroo/iso-harness` ≄0.6.1 writes `.opencode/opencode-model-fallback.json` during `npm run build:config` / `prepack`, alongside `opencode.json`. Ships **`retryable_error_patterns`** so Venice / Diem / insufficient-balance style errors match the plugin and rotate through the orchestrator `fallback_models` chain instead of wedging High4/20/2026
v2.14.0Real-world usage showed `qwen/qwen3-coder:free` is the single most contended free model on OpenRouter's shared pool — users were seeing visible "Venice rate-limited" fallback cascades on every chat. ## What changed Orchestrator keeps `qwen3-coder:free` (still the strongest free agentic model) but subagent roles now spread load across less-contended free providers via iso-route's retuned `openrouter-free` preset (v0.5.1): | Role | Before | After | |------|--------|-------| | `@general-free` (fHigh4/20/2026
v2.13.0## Feat - **Switches the OpenCode routing layer to 100% free OpenRouter models.** The @general-paid role, which previously ran on `opencode/glm-5.1` and was by far the biggest OpenCode cost line, now defaults to `openrouter/qwen/qwen3-next-80b-a3b-instruct:free`. Free-tier roles also update to the current-best free OpenRouter picks. - `@general-free` → `openrouter/minimax/minimax-m2.5:free` - `@general-paid` → `openrouter/qwen/qwen3-next-80b-a3b-instruct:free` - `@glm-minimal` → `opeHigh4/20/2026
v2.12.0## Summary Threads an opt-in **residential/mobile proxy** from `config/profile.yml` straight through every `geometra_connect` call in the apply / scan / auto-pipeline subagents. Collapses the class-B Ashby spam filter and Cloudflare-fronted ATS fingerprint blocks that rejected ~80-90% of untested Ashby tenants from headless datacenter-IP sessions in the 2026-04-19 empirical cycle. **BYO only.** JobForge does NOT bundle or resell proxy bandwidth — the candidate brings their own provider (BrightHigh4/20/2026
v2.11.0## Three tracks shipped together ### 1. agentmd Phase 3 pilot — \`modes/apply.md\` in agentmd dialect Extracted the load-bearing rules from the ~340-line apply runbook into a structured agentmd header (5 Hard limits, 6 Defaults, 15-step Procedure referencing each rule, Routing, Output format). Runbooks, decision tables, and portal-specific empirical notes all preserved verbatim as free-form reference below the contract. **New fixture suite**: 5 cases Ɨ 3 trials = 15 observations. **Haiku 4.5High4/19/2026
v2.10.0## One-line model policy \`models.yaml\` is now a single \`extends: standard\` line. All routing decisions for all four harnesses flow from \`@razroo/iso-route@0.3.0\`'s bundled preset; JobForge no longer hand-maintains provider/model pairs for any role. JobForge's three agents bind to preset roles via the \`role:\` frontmatter on each iso source file: | Agent | Preset role | Intent | |---|---|---| | \`@general-free\` | \`fast\` | Procedural (form-fill, TSV merge, OTP) | | \`@general-paid\` |High4/19/2026
v2.9.0See [CHANGELOG and release notes](https://github.com/razroo/JobForge/commit/f490478). iso-harness 0.6.0 + iso 0.2.3 required.High4/19/2026
v2.8.0## Per-harness model picks in `models.yaml` One authored file now expresses different model choices on each harness. ```yaml roles: general-free: provider: anthropic model: claude-haiku-4-5 # Claude Code, Codex, Cursor advisory targets: opencode: provider: opencode model: opencode/big-pickle # OpenCode free-tier proxy ``` Each harness gets the model that makes sense for it — Claude Code and Codex consumers route to Anthropic with their owHigh4/19/2026
v2.7.0## Cross-harness model routing JobForge subagents (`@general-free`, `@general-paid`, `@glm-minimal`) now materialise across **all four coding harnesses** with appropriate cost-tier routing. Previously only OpenCode got them; Claude Code, Cursor, and Codex users only saw the top-level instructions. One source of truth — `models.yaml` at the project root: ```yaml default: provider: anthropic model: claude-sonnet-4-6 roles: general-free: { provider: anthropic, model: claude-haiku-4-5 } gHigh4/19/2026
v2.6.0## 3 empirical additions from 2026-04-19 cycle 4 ### 1. Class-B Ashby tenant additions Added from clean-fill-failed-submit evidence: **Goody, Starbridge, Graphite, Prompt Health, Vantage**. 5/5 Ashby untested tenants tested this cycle tripped the env-fingerprint spam flag — strong prior that untested Ashby tenants default to class B. ### 2. Breezy portal patterns - Tenant-dependent: Courted applied cleanly, Avantos hit Breezy's own IP-duplicate-detection banner on first submit. - Native `<seleHigh4/19/2026
v2.5.0## 8 empirical improvements from 2026-04-19 session (29 Applied) ### 1. merge-tracker: role fuzzy-match over-collapse fix Previous logic matched on any 2+ shared words >3 chars, which collapsed different SWE roles at the same company. On 2026-04-19 this merged 4 distinct Datadog roles (ML Observability / Logs / GenAI / Distributed Systems) into a single row. Fixed: strip generic seniority+engineering stopwords (`staff`, `senior`, `software`, `engineer`, etc.) and split on role punctuation so diHigh4/19/2026
v2.4.0## 5 empirical improvements from 2026-04-19 session ### 1. merge-tracker: status precedence fix (fixes silent Applied drops) A higher-score Evaluated row was silently blocking lower-score Applied/Failed/SKIP outcomes from propagating, because the merge considered score alone. Fixed: lifecycle status (Evaluated < Applied < Interview < Offer, etc.) now advances unconditionally regardless of score, and status + pdf propagate on update. Applied will not regress to Evaluated on rescore. ### 2. AshbHigh4/19/2026
v2.3.0## Ashby anti-bot: two failure classes + imeFriendly default Distinguishes React-validation-lag blocks (recoverable via `imeFriendly: true` composition events) from environment-fingerprint blocks (datacenter IP / VPN / headless Chromium signatures — non-recoverable in headless automation). Adds a one-retry rule so subagents don't loop on fingerprint-class failures. ### Evidence (2026-04-19 session) - **Class A confirmed:** Supabase #793 — first submit rejected, refill with `imeFriendly: true` High4/19/2026
v2.2.0## Fixes ID collisions + duplicate applies when same role hits multiple same-day batches ### Changed - **`scripts/next-num.mjs`** — now scans `reports/` + `data/applications/*.md` (`#` column) + `batch/tracker-additions/*.tsv` (pending and merged), returns max+1. Previously only read `reports/`, which missed numbers assigned by SKIP entries and tracker-only advances. - **Hard Limit #2 (dedup scope)** — expanded from `pipeline.md + today's day file` to all day files + pending and merged trackerHigh4/18/2026
v2.1.0## Features Expands scan coverage beyond Greenhouse/Ashby/Lever to 4 new portal types. - **Workday** — Fortune-500 heavy (Salesforce, Adobe, Oracle, Shopify, NVIDIA, etc.). POST to `{subdomain}.{pod}.myworkdayjobs.com/wday/cxs/{tenant}/{site}/jobs`. Finicky — subagents fall through to Geometra scraping on empty API returns rather than fabricate results. - **SmartRecruiters** — clean GET API at `api.smartrecruiters.com/v1/companies/{company}/postings`. Used by Bosch, Visa, McDonald's. - **WeWorHigh4/18/2026
v2.0.3## What's new in 2.0.3 - **`Failed` canonical status** — added to `templates/states.yml`; prevents silent `Failed → Evaluated` coercion in `merge-tracker.mjs`. - **Centralized JS state handling** in `lib/canonical-states.mjs`. `merge-tracker.mjs` and `normalize-statuses.mjs` now share one source. Dashboard Go lists get `KEEP IN SYNC` comments pending full codegen. - **Structured location constraints** (`location_constraints` block in `config/profile.example.yml`). New Apply Preflight filter in High4/18/2026
v2.0.2## Harness hardening ### Hard Limit #7 — URL provenance URLs dispatched to downstream subagents MUST come from an authoritative file (`data/pipeline.md`, `data/scan-history.tsv`, `batch/scan-output-*.md`, or a `reports/{num}-*.md` header) — never from a prior subagent's prose return message. **Why:** a scan subagent once returned 30 plausible-looking Greenhouse IDs in prose that did not exist in the Greenhouse API. 30 downstream subagents were dispatched against fake URLs, costing ~2h and corrHigh4/18/2026
v2.0.1## Fix - \`bin/create-job-forge.mjs\` now writes \`\"job-forge\": \"^2.0.0\"\` (npm registry) into new scaffolded projects instead of the old \`github:razroo/JobForge\` reference. Without this, every new scaffold pinned itself to GitHub instead of the npm tarball, defeating the whole v2.0.0 publish. ## Docs - \`README.md\`, \`docs/README.md\`, \`docs/SETUP.md\`, \`docs/ARCHITECTURE.md\` all updated: - Quick Start uses \`npx --package=job-forge create-job-forge\` (npm registry) - Consumer High4/17/2026
v2.0.0## First npm release \`job-forge\` is live on npm for the first time. Consumers can now: \`\`\`bash npx create-job-forge ~/my-jobs cd ~/my-jobs npm install \`\`\` The \`postinstall\` hook symlinks \`.opencode/\`, \`.cursor/\`, \`.claude/\`, \`.codex/\`, \`modes/\`, \`templates/\`, \`AGENTS.harness.md\`, \`CLAUDE.harness.md\`, etc. from the installed package into the consumer's project root. \`npm update job-forge\` pulls the latest harness. ## Architecture - **Single source of truth**: \`isHigh4/17/2026

Dependencies & License Audit

Loading dependencies...

Similar Packages

ThumbGateSelf-improving agent governance: šŸ‘/šŸ‘Ž → Pre-Action Gates that block repeat AI mistakes. Stop paying for the same mistake twice.v1.14.1
@ipio-ai/cliIPIO CLI — Distributed AI agent coordination for game development1.8.1
@pajamadot/cliPajama Game Studio CLI — Distributed AI agent coordination for game development1.7.1
real-link-aiReal Link AI CLI — Distributed AI agent coordination for game development1.6.6
@actwith-ai/mcp-serverGive your AI agent a career. Persistent memory, reputation, expertise, and community — for any MCP-compatible AI agent.0.15.1