Skip to content

akshaykumar94/jobdeck

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

112 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

JobDeck

AI that tells you which jobs not to apply to. Apply to 10 jobs like a sniper, not 500 like a bot.

JobDeck demo

Claude Code React Tremor Node.js Playwright License

Most "AI job search" tools optimize for more applications. JobDeck optimizes for better applications — it reads your CV, scores every job on 6 dimensions, and actively tells you to skip the ones that don't fit. For the ~10% that do, it generates a tailored ATS-optimized CV and drafts your application answers in parallel.

Built as a fork of santifer/career-ops. Free for personal use. See NOTICE.md for license details.


Screenshots

JobDeck dashboard — stats, filters, charts

Dashboard — jobs scanned with score distribution, active filter chips, role category and company charts. One-click Generate for the filtered shortlist.

Job list with scores, status badges, and per-row actions

Job list — match scores, status badges (New / Applied / Skipped), sniper tier labels, and per-row actions: Apply (opens JD + PDF), Mark Applied, Answer Qs, Regen, Report.

Application answer drafting

Answer Qs — paste custom application questions, get proof-point-first answers drafted from your saved evaluation + CV.


Quick Start

# Clone and install
git clone https://github.com/akshaykumar94/jobdeck.git
cd jobdeck && npm install
npx playwright install chromium

# Configure
cp config/profile.example.yml config/profile.yml  # your name, targets, etc.
cp CLAUDE.md.example CLAUDE.md                     # your context for Claude
cp templates/portals.example.yml portals.yml       # companies to track
# Create cv.md in project root with your CV in markdown

# Scan jobs (zero token cost)
node scan.mjs
node enrich-levels.mjs

# Launch dashboard
cd dashboard && npm install && npm run dev         # http://localhost:5173

Features

Feature How it works
18 filters Role category, level, department, country, workplace type, employment type, company, tier, score, status, recency, keyword include/exclude, location, hide applied — all multi-select
Batch generation 3 parallel workers × 5 jobs per Claude session. Context loads once per batch (~50% fewer tokens)
ATS-optimized PDFs Space Grotesk + DM Sans template, keyword-injected per JD, clean filename for uploads
Score-based triage 6-dimension A-G evaluation. Below 3.5 = report only, no PDF wasted
Answer Qs Drafts custom form responses using the saved evaluation + CV. Appended to report
Company catalog ~40 curated companies with live ATS validation, multi-select bulk-add
Add Company Paste any careers URL, slug auto-extracted, ATS probed before saving
Scan Now Pulls jobs from all tracked companies via public APIs. Zero tokens
Level enrichment Parses "X+ years" from JD bodies for rows where the title doesn't specify level
Apply tracking Mark Applied / Undo with persistent state across sessions
Regenerate Fresh report number, old kept as history, dashboard shows newest
Light / dark themes Solar Tremor palette, Lucide icons throughout

Works for any profession

Role categories, level labels, and target presets are configurable in profile.yml. The defaults are for software engineers, but you can adapt for nursing, trades, sales, or any field:

dashboard:
  role_categories:
    - id: icu
      label: "ICU / Critical Care"
      patterns: ["\\b(icu|intensive care|critical care)\\b"]
    - id: er
      label: "Emergency"
      patterns: ["\\b(emergency|er|trauma)\\b"]
  my_targets:
    categories: [icu, er]

Architecture

scan.mjs          → Greenhouse / Lever / Ashby public APIs → scan-history.tsv
enrich-levels.mjs → Fetches JD body, parses years → min_years_exp column
dashboard/
  server.mjs      → Express on :3001, reads flat files, spawns claude -p
  src/App.tsx      → React + Tremor + Lucide, 18 filters, charts, modals
  catalog.json     → Curated company list with ATS slugs
lib/
  jd-fetch.mjs     → Shared JD fetcher (Greenhouse + Lever + Ashby)
  detect-level.mjs → Shared level detection (title regex + years mapping)

All data lives in flat files — no database. scan-history.tsv, reports/*.md, output/*/, data/applied.tsv. Git-versionable, inspectable, portable.

See dashboard/README.md for endpoint reference and worker config.


CLI Usage

JobDeck also works as a Claude Code slash command (inherited from career-ops):

/career-ops {paste JD}   → Full evaluation + PDF + tracker
/career-ops scan         → Scan portals
/career-ops pdf          → Generate ATS CV
/career-ops batch        → Batch evaluate
/career-ops tracker      → View status
/career-ops apply        → Fill forms with AI

Tests

npm test    # 21 tests via vitest (detect-level, jd-fetch)

Credits

Fork of santifer/career-ops — the original CLI-driven job search system. Upstream files remain under MIT. JobDeck additions are under PolyForm Noncommercial 1.0.0.


Disclaimer

JobDeck is a local tool. Your data stays on your machine. The system never auto-submits applications — you always click submit yourself. AI-generated content should be reviewed before use. Comply with the ToS of job boards you interact with.

About

Mission control for your job search. Scan, score, tailor, apply.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • JavaScript 55.5%
  • TypeScript 27.5%
  • Go 9.6%
  • Shell 3.4%
  • HTML 2.5%
  • CSS 1.3%
  • Nix 0.2%