jd scoring · tailored cv pdfs · portal scans · markdown tracker · six standalone clis · web + terminal dashboards
A fork of santifer/career-ops with a Next.js landing page and coverage extensions for non-AI job categories.
Quick start | Features | Use | Dashboards | Fork map | Credits
Runs from your terminal against files you own. No server, no account, no database.
❤️ Sponsor this project ❤️
The /admin pipeline view running on sample data.
Paste a job description and get a scored fit evaluation against your CV, plus a tailored ATS-clean PDF ready to submit. It scans your configured job boards for new postings and tracks every application in a plain markdown pipeline. The whole loop runs from your terminal against files you own.
flowchart LR
A[Job description] --> B[Scored evaluation]
B --> C[Tailored CV PDF]
C --> D[Tracker entry]
D --> E[Dashboards]
- 📋 JD in, decision out: the
/career-opsskill evaluates a pasted job description against yourcv.mdand profile, writes a scored report, and appends the tracker. - 📄 ATS-clean PDF:
generate-pdf.mjsrenders a tailored CV variant per JD;verify-pipeline.mjschecks the loop end to end. - 🗂️ Portal scans by name: configured queries for Ashby, Greenhouse, and Lever boards ship in
templates/portals.example.yml, with non-AI board coverage intemplates/portals.extensions.yml. - 🧰 Six standalone CLIs: rehearse, tailor, negotiate, outreach, timeline, and learn-rejection each run as a plain npm script, no Claude session needed.
- 🖥️ Two dashboards, one data model: a web
/adminsurface and a Go TUI, both reading the same markdown tracker, both falling back to clearly labeled sample data when no tracker exists. - 🎨 One token file: the web layer styles from
tokens/tokens.cssand the TUI'swranngletheme maps the same palette. - 🧪 Tested: 126 unit tests and 82 integrity checks pass on
npm test.
-
Clone and install
git clone https://github.com/wranngle/career_architect.git cd career_architect # Prereqs: Node >=20.19, Go >=1.24.2, Python >=3.11 npm install npx playwright install chromium pip install -r requirements.txt
-
Configure your profile
cp config/profile.example.yml config/profile.yml cp modes/_profile.template.md modes/_profile.md cp templates/portals.example.yml portals.yml # Optional: append sections from templates/portals.extensions.yml # into portals.yml for non-AI board coverage. # Create cv.md with your master resume content.
-
Validate the environment
npm run doctor
-
Open Claude Code in the repo and type
/career-ops.
Personal data can also live in a separate directory instead of the repo: run any script from that directory and it resolves user-layer paths (cv.md, config/, data/, reports/, output/) against your CWD. See "Split-repo layout" in DATA_CONTRACT.md.
Get the job-search pipeline from JD intake to evaluation, PDF generation, tracker status, portal scans, follow-up checks, recruiter practice, CV tailoring, negotiation drafts, outreach messages, timelines, and rejection lessons.
/career-ops # show all subcommands
/career-ops <JD text or URL> # auto-pipeline: evaluate -> PDF -> tracker
/career-ops scan # scan all enabled portals
/career-ops pdf # tailor cv.md for one JD, render PDF
/career-ops tracker # pipeline status
/career-ops followup # flag overdue follow-ups
Full list: .claude/skills/career-ops/SKILL.md.
Six of the steps also run standalone, no Claude session needed. With npm scripts, CLI args go after --, e.g. npm run tailor -- <jd.md>.
Worked example: tailor a CV against the sample JD
npm run tailor -- fixtures/jd-sample.mdEvery CLI runs the same way against the sample files in fixtures/, so you can try the whole toolbelt before touching your own data:
npm run rehearse->node bin/rehearse.mjs: 5-turn mock recruiter call. Usage:npm run rehearse -- --company <slug> --mock <fixture.json> [--turns 5] [--root <dir>]. The--mockflag is currently required (live recruiter client not wired).npm run tailor->node bin/tailor.mjs: per-JD CV variant. Usage:npm run tailor -- <jd.md> [--root <dir>] [--cv <cv.md>] [--out-dir <dir>].npm run negotiate->node bin/negotiate.mjs: offer negotiation script generator. Usage:npm run negotiate -- <offer.json> [--root <dir>] [--out-dir <dir>]. Offer JSON must includecompensation.base_salary_usd.npm run outreach->node bin/outreach.mjs: cold-message generator. Usage:npm run outreach -- <person.json> <jd.json> [--write] [--root <dir>] [--out-dir <dir>]. Prints to stdout;--writealso writes a file.npm run timeline->node bin/timeline.mjs: application calendar built fromdata/applications.md. Usage:npm run timeline -- [--root <dir>] [--out <path>] [--today YYYY-MM-DD] [--include ...] [--stdout]. Writesout/timeline.mdby default.npm run learn-rejection->node bin/learn-rejection.mjs: rejection-feedback learner; extracts lessons from a rejection email intodata/lessons.md. Usage:npm run learn-rejection -- <rejection.md> [--root <dir>] [--lessons <path>] [--today <YYYY-MM-DD>] [--stdout].
Two surfaces, one data model. Both read local career-ops files when they exist and fall back to clearly labeled sample data when the tracker is not initialized, so the first run always renders something honest.
npm run dev
# then open http://localhost:3000/adminPipeline, Progress, and Scans screens plus a Profile readiness view, with a data banner on every page stating whether you are looking at live or demo rows.
Scans screen, demo mode, banner on.
cd dashboard && go build -o ../career-dashboard .
../career-dashboard --path .. --theme=wranngle # or catppuccin-latte / catppuccin-mocha / autoSee dashboard/README.md for the full theme and flag reference.
| Claude Code the /career-ops skill drives the whole loop conversationally |
Six CLIs rehearse, tailor, negotiate, outreach, timeline, learn-rejection |
Web /admin pipeline, progress, and scans in the browser |
Go TUI the same tracker, terminal-native |
Every surface reads and writes the same plain markdown files, so nothing is locked in.
Upstream Career-Ops is tuned for senior AI/ML engineers searching Greenhouse, Ashby, and Lever. This fork adds non-AI portal coverage (templates/portals.extensions.yml), the Next.js landing page and /admin dashboard, and keeps upstream's architecture and license. UPSTREAM.md maps what is upstream and what is local.
| Item | State |
|---|---|
CI gate running npm test on every push |
next |
examples/ fixtures feeding the /admin demo rows directly |
next |
Live recruiter client for rehearse (mock fixtures drive it today) |
next |
Same as upstream: no database, no auto-submit, no background/job queues, no vector DB. Claude evaluates and tailors; you submit via Simplify.jobs or any other manual path.
MIT, matching upstream. See LICENSE.
All non-trivial design credit belongs to Santiago Fernández de Valderrama (@santifer). This fork layers coverage extensions and a landing page on top. Fork-specific bug reports and feature requests go to this repo's issues; upstream questions route per SUPPORT.md.

