The Problem
Job seekers spend hours manually searching multiple boards, tailoring resumes, and tracking application status across email and spreadsheets. The process is repetitive, error‑prone, and slows the feedback loop with recruiters.
What This Does
JobOps provides a self‑hosted pipeline that aggregates listings from >10 boards, scores fit with an LLM, rewrites each CV, and watches Gmail for status updates. The UI lives in the docs-site/ folder (a Docusaurus site) and is built with React/TypeScript (docs-site/src/components/HomepageFeatures/index.tsx). Backend orchestration, extractor definitions, and AI provider integration are defined in the root Dockerfile and supporting config files (.env.example, .codex/environment.toml). Extractors are modular TypeScript files under docs-site/docs/extractors/ (e.g., adzuna.md, golang-jobs.md).
How To Use It
Setup
Clone the repo git clone https://github.com/DaKheera47/job-ops.git cd job-ops Install env variables (copy template and edit) cp .env.example .env edit .env – set CODex login, OPENAIAPIKEY, GMAILOAUTHCLIENT_ID, etc. Build and start containers docker compose up -d # uses Dockerfile and docker-compose.yml
The compose file maps the web UI to http://localhost:3005 as described in README.md.
Configuration
.env – required keys are documented in .env.example. docs-site/package.json – defines the React build (npm run build) and dev server (npm start). docs-site/tsconfig.json – TypeScript compiler settings for custom extractors.
Running
The UI is served by the container built from Dockerfile. No separate CLI is exposed; interaction occurs through the browser wizard (onboarding flow). For a local dev loop:
cd docs-site npm install # installs React deps npm start # runs Docusaurus dev server on localhost:3005
Real‑World Use
A recruiting team can spin up JobOps on an internal server, configure a shared Gmail account, and let each recruiter log in via the web UI. When a candidate applies to a new role, the system auto‑generates a tailored PDF (via Reactive Resume integration) and records the interview status as emails arrive, eliminating manual spreadsheet updates.
Example workflow (pseudo‑code)
name: Search & Score uses: job-ops/extractor@v0.1 with: board: "LinkedIn" query: "senior backend engineer" name: Generate CV run: npm run generate-cv -- --job-id ${{ steps.search.outputs.id }}
Code Health & Issues
Low – Limited test coverage – only one test file (docs-site/src/lib/umami.test.ts) covers analytics, not core pipeline logic. Medium – Backend entry point unclear – Dockerfile builds an image but no explicit CMD or ENTRYPOINT is visible from the file list; documentation assumes the UI is the primary interface. Low – Secrets in repo – .env.example is present, but no .env is committed; users must supply API keys manually, which is appropriate. Low – License present – LICENSE file included, satisfying legal requirements. Low – CI configured – GitHub Actions workflows (.github/workflows/ci.yml, release.yml) run lint and build steps, indicating a basic CI pipeline.
Overall the repository follows standard Node/Docker conventions, and the documentation (docs-site/docs/) is extensive and versioned.
The Bottom Line
JobOps delivers a usable self‑hosted stack for aggregating job listings, AI‑driven resume tailoring, and email‑based status tracking, with a polished React front‑end and Dockerized deployment. The core backend logic is not directly exposed in the source tree, and test coverage is minimal, so teams should audit the extractor code before production use. It is best suited for small‑to‑medium recruiting groups that can manage their own Docker host and provide required API credentials.