Skip to main content
Version: 0.1.21

Self-Hosting (Docker Compose)

The easiest way to run JobOps is via Docker Compose. The app is self-configuring and guides you through setup on first launch.

Prerequisites

  • Docker Desktop or Docker Engine + Compose v2

1) Start the stack

No environment variables are required to boot:

docker compose up -d

This pulls the pre-built image from GHCR and starts the API, UI, and scrapers in one container.

To build locally instead:

docker compose up -d --build

2) Access the app and onboard

Open:

  • Dashboard: http://localhost:3005

The onboarding wizard helps you validate and save:

  1. LLM Provider: OpenRouter by default (or OpenAI/Gemini/local URL).
  2. PDF Export: RxResume credentials for PDF generation.
  3. Template Resume: Choose a base resume from your RxResume account.

Settings are saved to the local database.

Gmail OAuth (Tracking Inbox)

If you want Gmail integration, configure OAuth credentials.

1) Create Google OAuth credentials

In Google Cloud:

  1. Configure OAuth consent screen.
  2. Enable Gmail API.
  3. Create OAuth client ID (Web application).
  4. Add redirect URI:
  • http://localhost:3005/oauth/gmail/callback
  • Or your production URL, for example https://your-domain.com/oauth/gmail/callback

2) Configure environment variables

  • GMAIL_OAUTH_CLIENT_ID (required)
  • GMAIL_OAUTH_CLIENT_SECRET (required)
  • GMAIL_OAUTH_REDIRECT_URI (optional, recommended in production)

3) Restart and connect

  • Restart container
  • Open Tracking Inbox and click Connect Gmail

Email-to-job matching overview

flowchart TD
A[Recruitment email arrives in Gmail] --> B[Smart Router AI analyzes content]
B --> C{How confident is the match?}

C -->|95-100%| D[Auto-linked to job]
D --> E[Timeline updated automatically]

C -->|50-94%| F[Goes to Inbox for review with suggested job match]

C -->|<50%| G{Is it relevant?}
G -->|Yes| H[Goes to Inbox as orphan]
G -->|No| I[Ignored]

F --> J{User review}
H --> J
J -->|Approve| K[Linked to job + timeline update]
J -->|Ignore| L[Marked not relevant]

Persistent data

./data bind-mount stores:

  • SQLite DB: data/jobs.db
  • Generated PDFs: data/pdfs/

Public demo mode

Set DEMO_MODE=true for sandbox deployments.

Behavior in demo mode:

  • Works locally: browsing/filtering/status/timeline edits
  • Simulated: pipeline run/summarize/process/rescore/pdf/apply
  • Blocked: settings writes, DB clear, backups
  • Auto-reset: every 6 hours

Updating

git pull
docker compose pull
docker compose up -d

Self-hosted Reactive Resume

If you self-host Reactive Resume, set:

  • RXRESUME_URL=http://rxresume.local.net