{"id":48984023,"url":"https://github.com/razroo/jobforge","last_synced_at":"2026-04-26T07:01:45.641Z","repository":{"id":350985554,"uuid":"1208385069","full_name":"razroo/JobForge","owner":"razroo","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.","archived":false,"fork":false,"pushed_at":"2026-04-26T00:15:05.000Z","size":26868,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-26T02:19:40.733Z","etag":null,"topics":["agents","ats","career","claude-code","codex","cursor","iso-harness","job-search","mcp","opencode"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/job-forge","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/razroo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":["https://github.com/razroo/JobForge"]}},"created_at":"2026-04-12T07:47:22.000Z","updated_at":"2026-04-26T00:15:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/razroo/JobForge","commit_stats":null,"previous_names":["razroo/jobforge"],"tags_count":30,"template":false,"template_full_name":null,"purl":"pkg:github/razroo/JobForge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/razroo%2FJobForge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/razroo%2FJobForge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/razroo%2FJobForge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/razroo%2FJobForge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/razroo","download_url":"https://codeload.github.com/razroo/JobForge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/razroo%2FJobForge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32288653,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T06:26:00.361Z","status":"ssl_error","status_checked_at":"2026-04-26T06:25:58.791Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agents","ats","career","claude-code","codex","cursor","iso-harness","job-search","mcp","opencode"],"created_at":"2026-04-18T12:04:26.404Z","updated_at":"2026-04-26T07:01:45.636Z","avatar_url":"https://github.com/razroo.png","language":"JavaScript","funding_links":["https://github.com/razroo/JobForge"],"categories":[],"sub_categories":[],"readme":"# JobForge\n\n\u003e AI-powered job search pipeline built on opencode. Evaluate offers, generate tailored CVs, scan portals, negotiate offers, and track everything -- powered by AI agents.\n\n![opencode](https://img.shields.io/badge/opencode-000?style=flat\u0026logoColor=white)\n![Node.js](https://img.shields.io/badge/Node.js-339933?style=flat\u0026logo=node.js\u0026logoColor=white)\n![Geometra](https://img.shields.io/badge/Geometra_MCP-4A90D9?style=flat\u0026logoColor=white)\n![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)\n![Made in USA](https://img.shields.io/badge/Made_in-USA_%F0%9F%87%BA%F0%9F%87%B8-red?style=flat)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"demo/demo.gif\" alt=\"JobForge Demo\" width=\"800\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003cem\u003ePaste a job URL. Get a scored evaluation, tailored CV, and tracked application — in seconds.\u003c/em\u003e\u003c/p\u003e\n\n---\n\n## Quick Start\n\n```bash\nnpx --package=job-forge create-job-forge my-job-search\ncd my-job-search\nnpm install\nopencode\n```\n\nThe 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.\n\nThen 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.\n\n**Upgrade later:** `npm run update-harness` (pulls latest `job-forge` from npm, re-syncs symlinks, prints the resolved version)\n\nFull setup guide and alternative install paths (including contributing to the harness itself): **[docs/SETUP.md](docs/SETUP.md)**.\n\n---\n\n## What Is This\n\nJobForge turns opencode into a full job search command center. Instead of manually tracking applications in a spreadsheet, you get an AI-powered pipeline that:\n\n- **Evaluates offers** with a unified 10-dimension weighted scoring system\n- **Generates tailored PDFs** -- ATS-optimized CVs with anti-AI-detection writing rules\n- **Scans portals** with fuzzy dedup (catches reposts with new URLs)\n- **Processes in batch** -- evaluate 10+ offers in parallel with sub-agents\n- **Tracks everything** with pipeline integrity checks and canonical state management\n- **Manages follow-ups** -- timing-based nudges so you never miss a window\n- **Learns from rejections** -- pattern analysis across all rejections by stage, archetype, and score\n- **Negotiates offers** -- structured comp breakdown, leverage assessment, counter-offer strategy\n\n\u003e **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.\n\n## Features\n\n| Feature | Description |\n|---------|-------------|\n| **Auto-Pipeline** | Paste a URL, get a full evaluation + PDF + tracker entry |\n| **Unified Scoring** | 10 weighted dimensions, consistent across all modes, with calibration anchors |\n| **Anti-AI-Detection CVs** | Writing rules that avoid ATS filters on Indeed, LinkedIn, Workday |\n| **6-Block Evaluation** | Role summary, CV match, level strategy, comp research, personalization, interview prep (STAR+R) |\n| **Interview Story Bank** | Curated bank of 10-12 stories with match counts, archetype tags, and automatic pruning |\n| **Follow-Up System** | Timing-based nudges: Applied 7+ days ago nudge, Interviewed 1 day ago thank-you note, email scanning via Gmail MCP |\n| **Gmail Integration** | MCP server configured to retrieve emails for interview callbacks, offer responses, and application status updates |\n| **Rejection Analysis** | Captures stage + reason, surfaces patterns (archetype gaps, scoring miscalibration) |\n| **Offer Negotiation** | Total comp breakdown, equity valuation, leverage from pipeline, counter-offer scripts |\n| **Deep Research** | Company research that feeds back into scores and interview prep |\n| **Smart LinkedIn Outreach** | Reads evaluation reports to craft targeted messages using top proof points |\n| **Portal Scanner** | 45+ companies pre-configured with fuzzy dedup for reposts |\n| **Batch Processing** | Parallel evaluation with `opencode run` workers, with honest verification flagging |\n| **Pipeline Integrity** | Automated merge, dedup, status normalization, health checks |\n| **Cost-Aware Agent Routing** | Three subagents (`@general-free`, `@general-paid`, `@glm-minimal`) with per-task model tiers; procedural work runs on free-tier models, quality-sensitive work on paid. See [Subagent Routing in AGENTS.md](AGENTS.md) for the task-to-agent mapping. |\n| **Automatic Model Fallback** | When a model rate-limits or 5xx's, [`@razroo/opencode-model-fallback`](https://www.npmjs.com/package/@razroo/opencode-model-fallback) rotates the agent through a configured `fallback_models` chain and replays the request. Ships with sensible defaults: free-tier agents fall back to another free model then to paid as an escape hatch, paid agents fall back to a different paid provider. |\n| **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. |\n\n## Usage\n\n```\n/job-forge                → Show all available commands\n/job-forge {paste a JD}   → Full auto-pipeline (evaluate + PDF + tracker)\n/job-forge scan           → Scan portals for new offers\n/job-forge pdf            → Generate ATS-optimized CV\n/job-forge batch          → Batch evaluate multiple offers\n/job-forge tracker        → View application status\n/job-forge apply          → Fill application forms with AI\n/job-forge pipeline       → Process pending URLs\n/job-forge contact        → LinkedIn outreach (uses evaluation report)\n/job-forge deep           → Deep company research (feeds back into scores)\n/job-forge followup       → Check what needs follow-up action\n/job-forge rejection      → Record/analyze rejection patterns\n/job-forge negotiation    → Structured offer negotiation\n/job-forge training       → Evaluate a course/cert\n/job-forge project        → Evaluate a portfolio project\n```\n\nOr just paste a job URL or description directly -- JobForge auto-detects it and runs the full pipeline.\n\n\u003e **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\".\n\n## How It Works\n\n```\nYou paste a job URL or description\n        │\n        ▼\n┌──────────────────┐\n│  Archetype       │  Classifies: LLMOps / Agentic / PM / SA / FDE / Transformation\n│  Detection       │\n└────────┬─────────┘\n         │\n┌────────▼─────────┐\n│  A-F Evaluation   │  Match, gaps, comp research, STAR stories\n│  (reads cv.md)    │  Unified 10-dimension scoring model\n└────────┬─────────┘\n         │\n    ┌────┼────┐\n    ▼    ▼    ▼\n Report  PDF  Tracker\n  .md   .pdf   .tsv\n         │\n    ┌────┼────┐\n    ▼    ▼    ▼\n Apply  Follow  Negotiate\n        up      (if offer)\n```\n\n## Project Structure\n\n**Your personal project** (after `npx --package=job-forge create-job-forge my-search`):\n\n```\nmy-search/\n├── package.json                  # depends on \"job-forge\": \"^2.0.0\" (npm registry)\n├── opencode.json                 # thin config — enables MCPs + states.yml\n├── cv.md                         # your CV (personal)\n├── article-digest.md             # your proof points (optional, personal)\n├── portals.yml                   # companies to scan (personal)\n├── config/profile.yml            # your identity, target roles (personal)\n├── data/                         # applications, pipeline, scan history (personal, gitignored)\n├── reports/                      # generated evaluation reports (personal, gitignored)\n├── batch/{batch-input,batch-state}.tsv, tracker-additions/, logs/   # personal\n├── AGENTS.md                     # personal overrides (opencode + codex)\n├── CLAUDE.md                     # personal overrides (Claude Code), @-imports CLAUDE.harness.md\n│\n│ # ↓ symlinks into node_modules/job-forge/, regenerated by postinstall sync.mjs\n├── AGENTS.harness.md             # → harness instructions (loaded via opencode.json)\n├── CLAUDE.harness.md             # → harness instructions (imported from personal CLAUDE.md)\n├── .mcp.json                     # → Claude Code MCP config\n├── .codex/config.toml            # → Codex MCP config\n├── .cursor/mcp.json              # → Cursor MCP config\n├── .cursor/rules/main.mdc        # → Cursor always-apply rule\n├── .opencode/skills/job-forge.md # → skill router\n├── .opencode/agents/             # → @general-free, @general-paid, @glm-minimal\n├── modes/                        # → _shared.md + skill modes\n├── templates/                    # → states.yml, portals.example.yml, cv-template.html\n├── batch/batch-prompt.md         # → batch worker prompt\n├── batch/batch-runner.sh         # → parallel orchestrator\n│\n└── node_modules/job-forge/       # the harness (from npm: `job-forge@2.x`)\n```\n\nSymlinks 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`.\n\n**The harness itself** (this repo, what gets published as `job-forge` on npm):\n\n```\nJobForge/\n├── iso/                          # ← SOURCE OF TRUTH for harness configuration\n│   ├── instructions.md           # → AGENTS.md + CLAUDE.md (Claude Code / Codex / Cursor)\n│   ├── mcp.json                  # → .mcp.json + .cursor/mcp.json + .codex/config.toml + opencode.json\n│   ├── agents/*.md               # → .opencode/agents/*.md (general-free, general-paid, glm-minimal)\n│   ├── commands/job-forge.md     # → .opencode/skills/job-forge.md\n│   └── config.json               # per-harness top-level extras (e.g. opencode `instructions` array)\n│\n├── package.json                  # bin: job-forge, create-job-forge; prepack runs iso-harness\n├── bin/\n│   ├── job-forge.mjs             # CLI dispatcher (merge/verify/pdf/tokens/sync/...)\n│   ├── sync.mjs                  # postinstall: creates symlinks in consumer project\n│   └── create-job-forge.mjs      # scaffolder\n├── modes/                        # _shared.md + 16 skill modes\n├── templates/                    # cv-template.html, portals.example.yml, states.yml\n├── config/profile.example.yml    # template for consumer's profile.yml\n├── batch/{batch-prompt.md,batch-runner.sh}   # batch orchestrator\n├── scripts/\n│   ├── token-usage-report.mjs    # opencode cost analyzer\n│   └── release/check-source.mjs  # version gate for npm publish\n├── tracker-lib.mjs / merge-tracker.mjs / dedup-tracker.mjs / verify-pipeline.mjs\n├── normalize-statuses.mjs / generate-pdf.mjs / cv-sync-check.mjs\n├── dashboard/                    # optional Go TUI\n├── fonts/                        # Space Grotesk + DM Sans (for PDF)\n├── docs/                         # architecture, setup, customization\n└── .github/workflows/            # quality.yml + release.yml (CI publish to npm)\n```\n\nAll per-harness config trees (`.opencode/`, `.cursor/`, `.claude/`, `.codex/`, `CLAUDE.md`, `AGENTS.md`, `.mcp.json`, `opencode.json`) are **generated** from `iso/` by [`@razroo/iso-harness`](https://www.npmjs.com/package/@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.\n\n## Documentation\n\nIndex and cross-links: [docs/README.md](docs/README.md).\n\n- [Setup](docs/SETUP.md) — both install paths, profile, CV, portals, verify, token tracking, troubleshooting\n- [Architecture](docs/ARCHITECTURE.md) — package architecture, modes, evaluation flow, batch runner, pipeline scripts\n- [Customization](docs/CUSTOMIZATION.md) — archetypes, scanner keywords, CV template, states, customizing symlinked modes\n- [Model Routing](docs/MODEL-ROUTING.md) — the three cost-tiered subagents, why the architecture exists, and how to swap models or add your own\n- [Contributing](CONTRIBUTING.md) — branch workflow, quality gate, and ideas for PRs\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frazroo%2Fjobforge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frazroo%2Fjobforge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frazroo%2Fjobforge/lists"}