Thanks for helping improve JobOps.
This guide is intentionally short and GitHub-friendly. It focuses on contributor workflow and links to the existing docs for setup, style, and troubleshooting so we do not duplicate documentation.
- Bug fixes and reliability improvements
- UI/UX improvements
- Extractors and integrations
- Documentation updates
- Tests and developer experience improvements
Use the path that matches your change:
| Path | Main folders | Start command(s) | Canonical docs |
|---|---|---|---|
| Docs/content | docs-site/docs |
npm run docs:dev |
Docs style guide, FAQ |
| App/UI/API | orchestrator, shared |
npm --workspace orchestrator run dev |
Self-hosting, Troubleshooting |
| Extractors | extractors/*, sometimes shared |
Relevant type checks + tests | Add an extractor, Extractors overview |
For full end-user setup, environment variables, OAuth, and deployment details, use the Self-Hosting Guide and Gmail OAuth Setup.
Contributor baseline from repo root:
npm ci
npm --workspace orchestrator run db:migrate
npm --workspace orchestrator run devIf you are working with extractors that use Glassdoor, Indeed, or LinkedIn (powered by python-jobspy), set up the Python venv once:
python3 -m venv extractors/jobspy/.venv
extractors/jobspy/.venv/bin/pip install -r extractors/jobspy/requirements.txtThe runner auto-detects the venv — no need to set PYTHON_PATH.
If you are editing docs:
npm run docs:devLocal URLs:
- Orchestrator UI:
http://localhost:5173 - Orchestrator API:
http://localhost:3001 - Docs site:
http://localhost:3006
- Create a branch from
origin/main. - Keep the PR focused on one change or one problem.
- If the change is user-visible, update docs (or link the relevant docs update in the same PR).
- Include screenshots or short clips for UI changes when helpful.
- Mention any tradeoffs or follow-up work in the PR description.
Releases are driven from GitHub Actions.
- Open the
releaseworkflow in GitHub Actions. - Enter the next version as
x.y.z(for example0.1.30). - Optionally enter a separate release title for GitHub (for example
Google Dorks!). - Run the workflow.
The workflow will:
- bump
orchestrator/package.json - update
package-lock.json - cut the matching Docusaurus docs version
- commit the version bump to
main - create and push tag
vX.Y.Z - publish the
ghcr.io/.../job-opsimage for that release - create the GitHub release using either the custom title or
vX.Y.Z
The app version shown in the UI is sourced from orchestrator/package.json, so the release version, tag, and displayed app version stay aligned even when the GitHub release title is customized separately.
Run from the repository root:
./orchestrator/node_modules/.bin/biome ci .
npm run check:types:shared
npm --workspace orchestrator run check:types
npm --workspace gradcracker-extractor run check:types
npm --workspace ukvisajobs-extractor run check:types
npm --workspace orchestrator run build:client
npm --workspace orchestrator run test:runIf tests fail due to a better-sqlite3 Node ABI mismatch, rebuild it and rerun tests:
npm --workspace orchestrator rebuild better-sqlite3CI runs on Node 22. If local behavior differs, verify with Node 22 before concluding a change is valid.
Before editing server routes/services, read AGENTS.md for repository standards, especially:
/api/*response contract and status/code mapping- Correlation/request IDs (
x-request-id) and logging context - Shared logger usage in core server paths (no direct
console.*) - SSE helper usage
- Redaction/sanitization defaults for logs and error details
- Minimal webhook and LLM payload defaults