Shaheer Sarfaraz 6e771ce728
Timeline introduced (#38)
* initial implementation

* onboarding doesn't pop until invalid values are present

* link to job page

* proactive inputs working slightly

* onboarding gate reinstated

* better proactive buttons

* fully manual tracking for now.

* edit and delete timeline events

* status showing correctly

* tests update

* tests

* Update orchestrator/src/server/services/applicationTracking.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update orchestrator/src/server/services/applicationTracking.test.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update orchestrator/src/server/services/applicationTracking.test.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update orchestrator/src/client/pages/job/Timeline.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update orchestrator/src/client/pages/JobPage.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add tests for application tracking routes and remove unused actionId from client API

* remove unnecessary await from synchronous transitionStage calls and improve test isolation

* relax externalUrl validation to allow non-URL metadata

* add toast notifications for data loading and event logging in JobPage

* comments

* fix: resolve type error in sponsor-matching.test.ts

* fix ci

* tests fix for github

* lint

* github comments

* build fix

* dedupe

* format

* types fix

* Apply suggestion from @Copilot

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* formatting

* title and group id are discrete fields

* backfill

* hide view button on page

* show relevant dropdown options

* confetti!

* remove redundant

* confirm delete is a custom element now

* formatting

* fix styling

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-27 23:49:11 +00:00
2026-01-27 17:55:44 +00:00
2026-01-25 13:34:16 +00:00
2026-01-27 23:49:11 +00:00
2026-01-21 19:01:25 +00:00
2025-12-11 23:56:07 +00:00
2026-01-07 23:53:01 +00:00
2026-01-25 13:34:16 +00:00
2026-01-27 15:53:59 +00:00
2026-01-17 02:53:31 +00:00
2026-01-25 11:27:05 +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: Uses RxResume v4 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. Clone and move to directory
git clone https://github.com/DaKheera47/job-ops.git
cd job-ops

# 2. Start with Docker (pulls pre-built image from GHCR)
docker compose up -d

# 3. Open the dashboard, the app will onboard your credentials
open http://localhost:3005

The app will guide you through setup on first launch. The onboarding wizard helps you:

  • Connect your OpenRouter API key (for AI scoring/tailoring)
  • Add your RxResume credentials (for PDF export via v4.rxresu.me)
  • Select a template resume from your v4.rxresu.me account

Structure

  • /orchestrator: React frontend + Node.js backend & pipeline.
  • /extractors: Specialized scrapers (Gradcracker, JobSpy, UKVisaJobs).
  • /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)

You can make the app read-only for the public by setting a username and password in the Settings page. After this, all write actions (POST/PATCH/DELETE) require Basic Auth; browsing and viewing remain public.

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

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.

Note on Analytics: The current alpha version includes anonymous analytics (Umami) to help me debug performance. This will be made opt-in only in the upcoming updates. If you want to disable it now, block umami.dakheera47.com in your firewall.

Contact

If you need any help with any step of the process, feel free to open an issue. I am actively monitoring this section and I would be extremely happy to help you get up and running!

Star History Chart

License

AGPLv3

Description
JobOps — self-hosted job search discovery, scoring, and drafts
Readme AGPL-3.0 6.7 MiB
Languages
TypeScript 98.6%
Python 0.4%
Shell 0.4%
CSS 0.3%
Dockerfile 0.2%