2026-01-20 11:25:24 +00:00
2026-01-19 20:02:03 +00:00
2026-01-15 19:17:23 +00:00
2026-01-20 11:25:24 +00:00
2026-01-11 15:30:30 +00:00
2026-01-15 23:13:49 +00:00
2025-12-11 23:56:07 +00:00
2026-01-16 01:33:43 +00:00
2026-01-07 23:53:01 +00:00
2026-01-16 02:25:05 +00:00
2025-12-26 20:17:05 +00:00
2026-01-17 02:53:31 +00:00

JobOps

AI-powered job discovery and application pipeline. Automatically finds jobs, scores them against your profile, and generates tailored resumes.

Workflow

  1. Search: Scrapes Gradcracker, Indeed, LinkedIn, and UK Visa Sponsorship jobs.
  2. Score: AI ranks jobs by suitability using OpenRouter.
  3. Tailor: Generates a custom resume summary for top-tier matches.
  4. Export: Automates RxResume to create tailored PDFs.
  5. Manage: Review and mark jobs as "Applied" via the dashboard (syncs to Notion).

Example of generating a tailored resume for a job

https://github.com/user-attachments/assets/5b9157a9-13b0-4ec6-9bd2-a39dbc2b11c5

Example of applying to a Ready job

https://github.com/user-attachments/assets/06e5e782-47f5-42d0-8b28-b89102d7ea1b

Quick Start

# 1. Setup environment
cp .env.example .env

# 2. Run with Docker
docker compose up -d --build

# 3. Access Dashboard
# http://localhost:3005

Setup

Essential variables in .env:

  • OPENROUTER_API_KEY: For job scoring and tailoring.
  • RXRESUME_EMAIL/PASSWORD: To automate PDF exports.

Structure

  • /orchestrator: React frontend + Node.js backend & pipeline.
  • /extractors: Specialized scrapers (Gradcracker, JobSpy, UKVisaJobs).
  • /resume-generator: Python script for RxResume PDF automation.
  • /data: Persistent storage for SQLite DB and generated PDFs.

Technical breakdowns here: documentation/extractors/README.md Orchestrator docs here: documentation/orchestrator.md

Read-only mode (Basic Auth)

Set BASIC_AUTH_USER and BASIC_AUTH_PASSWORD in .env to make the app read-only for the public. After this, all write actions (POST/PATCH/DELETE) require Basic Auth; browsing and viewing remain public. 2. Put your exported RXResume JSON at resume-generator/base.json. 3. Start: docker compose up -d --build 4. Open:

  • Dashboard/UI: http://localhost:3005
  • API: http://localhost:3005/api
  • Health: http://localhost:3005/health

Persistent data lives in ./data (bind-mounted into the container).

Running (local dev)

Prereqs: Node 20+, Python 3.10+, Playwright browsers (Firefox).

Install Node deps (both packages):

cd orchestrator && npm install
cd ../extractors/gradcracker && npm install

Configure the orchestrator env + DB:

cd ../orchestrator
cp .env.example .env
npm run db:migrate
npm run dev

Set up the resume generator (used for PDF export):

cd ../resume-generator
python -m venv .venv
# Windows PowerShell:
.\.venv\Scripts\Activate.ps1
# macOS/Linux:
# source .venv/bin/activate
pip install playwright
python -m playwright install firefox

Dev URLs:

  • API: http://localhost:3001/api
  • UI (Vite): http://localhost:5173

Notes / sharp edges

  • Crawl targets: edit extractors/gradcracker/src/main.ts to change the Gradcracker location/role matrix.
  • Pipeline config knobs: POST /api/pipeline/run accepts { topN, minSuitabilityScore }; PIPELINE_TOP_N/PIPELINE_MIN_SCORE are used by npm run pipeline:run (CLI runner).
  • Anti-bot reality: crawling is headless + "humanized", but sites can still block; expect occasional flakiness.

License

AGPLv3

Description
No description provided
Readme AGPL-3.0 6.7 MiB
Languages
TypeScript 98.6%
Python 0.4%
Shell 0.4%
CSS 0.3%
Dockerfile 0.2%