docs: cut version 0.1.24
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
---
|
||||
id: ghostwriter
|
||||
title: Ghostwriter
|
||||
description: Context-aware per-job AI chat assistant behavior and API surface.
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
## What it is
|
||||
|
||||
Ghostwriter is the per-job AI chat assistant in JobOps.
|
||||
|
||||
Ghostwriter uses:
|
||||
|
||||
- current job description and metadata
|
||||
- reduced profile snapshot
|
||||
- global writing style settings
|
||||
|
||||
The UI behavior is one persistent conversation per job, shown in the right-side drawer from job details.
|
||||
|
||||
## Why it exists
|
||||
|
||||
Ghostwriter helps you produce job-specific writing quickly while preserving consistency with your profile and style settings.
|
||||
|
||||
Typical use cases:
|
||||
|
||||
- role-specific answer drafting
|
||||
- cover letter and outreach drafts
|
||||
- interview prep tied to the job description
|
||||
- rephrasing with tone constraints
|
||||
|
||||
## How to use it
|
||||
|
||||
1. Open a job in `discovered` or `ready`.
|
||||
2. Open the Ghostwriter drawer.
|
||||
3. Enter your prompt and stream a response.
|
||||
4. Stop or regenerate responses when needed.
|
||||
|
||||
### Writing style settings impact
|
||||
|
||||
Global settings affecting generations:
|
||||
|
||||
- `Tone`
|
||||
- `Formality`
|
||||
- `Constraints`
|
||||
- `Do-not-use terms`
|
||||
|
||||
Defaults:
|
||||
|
||||
- Tone: `professional`
|
||||
- Formality: `medium`
|
||||
- Constraints: empty
|
||||
- Do-not-use terms: empty
|
||||
|
||||
### Context and safety model
|
||||
|
||||
- Job snapshot is truncated to fit prompt budget.
|
||||
- Profile snapshot includes relevant slices only.
|
||||
- System prompt enforces read-only assistant behavior.
|
||||
- Logging stores metadata, not full prompt/response dumps.
|
||||
|
||||
### API surface
|
||||
|
||||
- `GET /api/jobs/:id/chat/messages`
|
||||
- `POST /api/jobs/:id/chat/messages` (streaming)
|
||||
- `POST /api/jobs/:id/chat/runs/:runId/cancel`
|
||||
- `POST /api/jobs/:id/chat/messages/:assistantMessageId/regenerate` (streaming)
|
||||
|
||||
Compatibility thread endpoints remain, but UI behavior is one thread per job.
|
||||
|
||||
## Common problems
|
||||
|
||||
### Responses feel too generic
|
||||
|
||||
- Verify the job description is complete and current.
|
||||
- Confirm style constraints in Settings are specific enough.
|
||||
|
||||
### Generation quality is lower than expected
|
||||
|
||||
- Check model/provider configuration in Settings.
|
||||
- Tighten prompts with explicit output intent (for example, "3 bullet points for recruiter outreach").
|
||||
|
||||
### Missing context in answers
|
||||
|
||||
- Update profile data and relevant project details used by Ghostwriter context.
|
||||
- Regenerate after updating job notes/description.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Settings](/docs/next/features/settings)
|
||||
- [Reactive Resume](/docs/next/features/reactive-resume)
|
||||
- [Orchestrator](/docs/next/features/orchestrator)
|
||||
@@ -0,0 +1,92 @@
|
||||
---
|
||||
id: in-progress-board
|
||||
title: In Progress Board
|
||||
description: Post-application kanban board for tracking fewer, higher-attention jobs through interview and offer stages.
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
## What it is
|
||||
|
||||
The In Progress Board is a kanban view for jobs that have moved beyond initial application.
|
||||
|
||||

|
||||
|
||||
It groups jobs into post-application lanes:
|
||||
|
||||
- Recruiter Screen
|
||||
- Assessment
|
||||
- Team Match
|
||||
- Technical Interview
|
||||
- Final Round
|
||||
- Offer
|
||||
- Closed
|
||||
|
||||
## Why it exists
|
||||
|
||||
JobOps uses two operational modes:
|
||||
|
||||
- **Pre-application tracking** (`Jobs` page): large volume, pipeline and readiness focused.
|
||||
- **Post-application tracking** (`In Progress Board`): smaller volume, higher attention per job.
|
||||
|
||||
Once a job enters the post-application phase, each opportunity usually needs tighter follow-up, interview prep, and deliberate stage management. A kanban board is better for that than a large list.
|
||||
|
||||
## How to use it
|
||||
|
||||
1. Open **In Progress Board**.
|
||||
2. Review jobs by lane to see current stage distribution.
|
||||
3. Drag a card to a new lane to log a stage transition.
|
||||
4. Open a card to view full job details and timeline.
|
||||
5. Use sorting (Recent / Title / Company) to prioritize review.
|
||||
|
||||
### Moving jobs into post-application
|
||||
|
||||
Jobs typically move into post-application tracking when they receive a response after applying.
|
||||
|
||||
This can happen via:
|
||||
|
||||
- Tracking Inbox review/automation (recommended)
|
||||
- Manual stage transitions in job detail/timeline tools
|
||||
|
||||
### API examples
|
||||
|
||||
```bash
|
||||
# List in-progress jobs
|
||||
curl "http://localhost:3001/api/jobs?status=in_progress&view=list"
|
||||
```
|
||||
|
||||
```bash
|
||||
# Move a job to technical interview
|
||||
curl -X POST "http://localhost:3001/api/jobs/<jobId>/stage-events" \
|
||||
-H "content-type: application/json" \
|
||||
-d '{
|
||||
"toStage": "technical_interview",
|
||||
"metadata": {
|
||||
"actor": "user",
|
||||
"eventType": "status_update",
|
||||
"eventLabel": "Moved to Technical Interview"
|
||||
}
|
||||
}'
|
||||
```
|
||||
|
||||
## Common problems
|
||||
|
||||
### Board is empty
|
||||
|
||||
- Confirm jobs have status `in_progress`.
|
||||
- Confirm stage events exist for applied jobs expected on the board.
|
||||
|
||||
### A card appears in an unexpected lane
|
||||
|
||||
- The board uses the latest stage event as source of truth.
|
||||
- Check timeline events for out-of-order or mistaken transitions.
|
||||
|
||||
### Drag-and-drop move failed
|
||||
|
||||
- Network/API error can roll back optimistic UI movement.
|
||||
- Retry move and check server logs for validation errors.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Overview](/docs/next/features/overview)
|
||||
- [Orchestrator](/docs/next/features/orchestrator)
|
||||
- [Post-Application Tracking](/docs/next/features/post-application-tracking)
|
||||
@@ -0,0 +1,77 @@
|
||||
---
|
||||
id: job-search-bar
|
||||
title: Job Search Bar
|
||||
description: Use the global job search/command bar to find and open jobs fast, with optional status locking.
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
The Job Search Bar is the quickest way to jump to any job from the Jobs page.
|
||||
|
||||

|
||||
|
||||
## Open it
|
||||
|
||||
Use either:
|
||||
|
||||
- keyboard shortcut: `Cmd+K` (macOS) or `Ctrl+K` (Windows/Linux)
|
||||
- the **Search** button in the Jobs page filter row
|
||||
|
||||
## What it searches
|
||||
|
||||
Search matches job fields with fuzzy ranking:
|
||||
|
||||
- title
|
||||
- company/employer
|
||||
- location
|
||||
|
||||
By default, very low-relevance matches are hidden so results stay focused on likely intent.
|
||||
|
||||
Results are grouped by status sections:
|
||||
|
||||
- Ready
|
||||
- Discovered
|
||||
- Applied
|
||||
- Other
|
||||
|
||||
Selecting a result opens that job in its correct tab automatically.
|
||||
|
||||
## Status lock (`@`)
|
||||
|
||||
You can lock the search scope to one status:
|
||||
|
||||
1. Type `@` plus a status prefix (example: `@rea`, `@app`).
|
||||
2. Press `Tab` or `Enter` to apply the lock.
|
||||
3. Continue typing your normal query.
|
||||
|
||||
Supported lock targets:
|
||||
|
||||
- `ready`
|
||||
- `discovered`
|
||||
- `applied`
|
||||
- `skipped`
|
||||
- `expired`
|
||||
|
||||
Common aliases:
|
||||
|
||||
- `ready`: `ready`, `rdy`
|
||||
- `discovered`: `discovered`, `discover`, `disc`
|
||||
- `applied`: `applied`, `apply`, `app`
|
||||
- `skipped`: `skipped`, `skip`, `skp`
|
||||
- `expired`: `expired`, `expire`, `exp`
|
||||
|
||||
## Lock controls
|
||||
|
||||
- `Backspace` on an empty query clears the active lock.
|
||||
- `Esc` clears the active lock while the search dialog stays open.
|
||||
- Closing the dialog resets lock state.
|
||||
|
||||
## When to use this vs filters
|
||||
|
||||
- Use **Search Bar** when you already know what role/company you want to jump to quickly.
|
||||
- Use **Filters** when you want broad narrowing (source, salary, sponsor, sort) for browsing.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Orchestrator](./orchestrator)
|
||||
- [Pipeline Run](./pipeline-run)
|
||||
- [Find Jobs and Apply Workflow](../workflows/find-jobs-and-apply-workflow)
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
id: keyboard-shortcuts
|
||||
title: Keyboard Shortcuts
|
||||
description: Complete keyboard shortcut reference for the Jobs page, including tab-scoped actions and help/search toggles.
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
This page documents keyboard shortcuts available on the Jobs page.
|
||||
|
||||
## Open shortcut help
|
||||
|
||||
Use `?` to toggle the keyboard shortcut dialog.
|
||||
|
||||
The dialog:
|
||||
|
||||
- shows shortcuts for your current tab context
|
||||
- groups shortcuts by Navigation, Actions, Tabs, and General
|
||||
- is shown automatically once for first-time users
|
||||
|
||||
## Bottom shortcut hint bar
|
||||
|
||||
On desktop (`lg+`), hold `Control` to reveal the bottom shortcut hint bar.
|
||||
|
||||
It shows the same tab-scoped shortcuts in a compact layout.
|
||||
|
||||
## Global navigation shortcuts
|
||||
|
||||
- `j` or `ArrowDown`: next job
|
||||
- `k` or `ArrowUp`: previous job
|
||||
- `1`: Ready tab
|
||||
- `2`: Discovered tab
|
||||
- `3`: Applied tab
|
||||
- `4`: All Jobs tab
|
||||
- `ArrowLeft`: previous tab
|
||||
- `ArrowRight`: next tab
|
||||
|
||||
## Search and help shortcuts
|
||||
|
||||
- `Cmd+K` / `Ctrl+K`: open job search bar
|
||||
- `/`: open job search bar
|
||||
- `?`: toggle keyboard shortcut help dialog
|
||||
|
||||
For search lock behavior (`@ready`, `@app`, etc.), see [Job Search Bar](./job-search-bar).
|
||||
|
||||
## Context action shortcuts
|
||||
|
||||
### Available in `discovered` and `ready`
|
||||
|
||||
- `s`: skip job
|
||||
|
||||
### Available in `discovered`
|
||||
|
||||
- `r`: move to Ready
|
||||
|
||||
Note: if you have multi-select active, `r` runs bulk move-to-ready.
|
||||
|
||||
### Available in `ready`
|
||||
|
||||
- `a`: mark applied
|
||||
- `p`: view PDF
|
||||
- `d`: download PDF
|
||||
|
||||
### Available in all tabs (when applicable)
|
||||
|
||||
- `o`: open job listing
|
||||
- `x`: toggle select current job
|
||||
- `Esc`: clear selection
|
||||
|
||||
## Shortcut availability rules
|
||||
|
||||
Shortcuts are disabled while blocking modals are open (for example Run modal, Filters, drawer states).
|
||||
|
||||
Search (`/`) and Help (`?`) can still open their own dialogs when other blocking dialogs are not active.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Job Search Bar](./job-search-bar)
|
||||
- [Orchestrator](./orchestrator)
|
||||
- [Pipeline Run](./pipeline-run)
|
||||
@@ -0,0 +1,63 @@
|
||||
---
|
||||
id: multi-select-and-bulk-actions
|
||||
title: Multi-Select and Bulk Actions
|
||||
description: Select multiple jobs with mouse or keyboard and run bulk actions like Move to Ready, Skip, or Recalculate match.
|
||||
sidebar_position: 5
|
||||
---
|
||||
|
||||
Multi-select lets you process many jobs at once instead of repeating the same action one-by-one.
|
||||
|
||||
## Why this exists
|
||||
|
||||
When you run discovery at scale, you often need to:
|
||||
|
||||
- skip batches of low-priority jobs
|
||||
- move a shortlist to Ready quickly
|
||||
- recalculate fit scores after settings/profile changes
|
||||
|
||||
Bulk actions reduce repetitive clicks, keep momentum high, and make triage runs faster.
|
||||
|
||||
## Mouse workflow
|
||||
|
||||
### Select jobs
|
||||
|
||||
1. Use the checkbox on each row to include/exclude a job.
|
||||
2. Use **Select all filtered** to select jobs currently visible in the active filtered list.
|
||||
3. Check the selected count in the list header.
|
||||
|
||||
### Run bulk actions
|
||||
|
||||
When one or more jobs are selected, a floating action bar appears at the bottom.
|
||||
|
||||
Available actions depend on selected job statuses:
|
||||
|
||||
- **Move to Ready**
|
||||
- **Skip selected**
|
||||
- **Recalculate match**
|
||||
- **Clear** (clears selection)
|
||||
|
||||
## Keyboard workflow
|
||||
|
||||
Use shortcuts from the Jobs page:
|
||||
|
||||
- `x`: toggle select on the currently focused job
|
||||
- `Esc`: clear current selection
|
||||
- `r`: in `discovered`, move to Ready
|
||||
|
||||
`r` behavior with selection:
|
||||
|
||||
- if you have a multi-selection active, `r` runs the bulk **Move to Ready** action
|
||||
- if nothing is selected, `r` runs move-to-ready for the single current job
|
||||
|
||||
## Important limits and behavior
|
||||
|
||||
- Bulk actions are capped at **100 jobs per run**.
|
||||
- `Select all filtered` also respects the same 100-job cap.
|
||||
- Selection resets when you switch tabs.
|
||||
- If jobs disappear from the active filtered list, they are removed from selection automatically.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Keyboard Shortcuts](./keyboard-shortcuts)
|
||||
- [Orchestrator](./orchestrator)
|
||||
- [Find Jobs and Apply Workflow](../workflows/find-jobs-and-apply-workflow)
|
||||
@@ -0,0 +1,127 @@
|
||||
---
|
||||
id: orchestrator
|
||||
title: Orchestrator
|
||||
description: Job states, ready flow, and PDF generation/regeneration behavior.
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
## What it is
|
||||
|
||||
The Orchestrator is the primary jobs workspace in JobOps.
|
||||
|
||||

|
||||
|
||||
It controls:
|
||||
|
||||
- job lifecycle states
|
||||
- manual and automatic ready flow
|
||||
- PDF generation and regeneration
|
||||
- handoff to post-application tracking
|
||||
|
||||
Job states:
|
||||
|
||||
- `discovered`: found by crawler/import, not tailored yet
|
||||
- `processing`: tailoring and/or PDF generation in progress
|
||||
- `ready`: tailored PDF generated and ready to apply
|
||||
- `applied`: marked as applied
|
||||
- `skipped`: explicitly excluded from active queue
|
||||
- `expired`: deadline passed
|
||||
|
||||
## Why it exists
|
||||
|
||||
Orchestrator centralizes the transition from discovered opportunities to application-ready artifacts.
|
||||
|
||||
It exists to ensure:
|
||||
|
||||
- a consistent path from discovery to tailored output
|
||||
- clear status transitions across manual and automated workflows
|
||||
- predictable regeneration behavior when job data changes
|
||||
|
||||
## How to use it
|
||||
|
||||
### Intended ready flow
|
||||
|
||||
1. Manual flow:
|
||||
1. Job starts in `discovered`.
|
||||
2. Open the job and choose Tailor.
|
||||
3. Edit JD/tailored fields/project picks.
|
||||
4. Click **Finalize & Move to Ready**.
|
||||
2. Auto flow:
|
||||
1. Pipeline scores discovered jobs.
|
||||
2. Top jobs above threshold are auto-processed.
|
||||
3. Jobs move directly to `ready` with generated PDFs.
|
||||
|
||||
### Ghostwriter availability
|
||||
|
||||
Ghostwriter is available in `discovered` and `ready` job views.
|
||||
|
||||
For details, see [Ghostwriter](/docs/next/features/ghostwriter).
|
||||
|
||||
### Opening documentation from the sidebar
|
||||
|
||||
1. Open the sidebar menu.
|
||||
2. In the footer section under `Version <build>`, click **Documentation**, which opens the locally hosted docs in a new tab.
|
||||
|
||||
### Generating PDFs
|
||||
|
||||
PDF generation uses:
|
||||
|
||||
- base resume selected from RxResume
|
||||
- job description
|
||||
- tailored summary/headline/skills/projects
|
||||
|
||||
Common paths:
|
||||
|
||||
- Discovered to finalization: `POST /api/jobs/:id/process`
|
||||
- Ready regeneration: `POST /api/jobs/:id/generate-pdf`
|
||||
|
||||
### Regenerating PDFs after edits (copy-pasteable examples)
|
||||
|
||||
If JD or tailoring changes, regenerate PDF to keep output in sync.
|
||||
|
||||
```bash
|
||||
curl -X PATCH "http://localhost:3001/api/jobs/<jobId>" \
|
||||
-H "content-type: application/json" \
|
||||
-d '{
|
||||
"jobDescription": "<new JD>",
|
||||
"tailoredSummary": "<optional>",
|
||||
"tailoredHeadline": "<optional>",
|
||||
"tailoredSkills": [{"name":"Backend","keywords":["TypeScript","Node.js"]}],
|
||||
"selectedProjectIds": "p1,p2"
|
||||
}'
|
||||
```
|
||||
|
||||
```bash
|
||||
curl -X POST "http://localhost:3001/api/jobs/<jobId>/summarize?force=true"
|
||||
curl -X POST "http://localhost:3001/api/jobs/<jobId>/generate-pdf"
|
||||
```
|
||||
|
||||
### External payload and sanitization defaults
|
||||
|
||||
- LLM prompts send minimized profile/job fields.
|
||||
- Webhooks are sanitized and whitelisted by default.
|
||||
- Logs and error details are redacted/truncated by default.
|
||||
- Correlation fields include `requestId`, and when available `pipelineRunId` and `jobId`.
|
||||
|
||||
## Common problems
|
||||
|
||||
### Job is stuck in `processing`
|
||||
|
||||
- `processing` is transient; failures generally revert the job to `discovered`.
|
||||
- Check run logs and retry generation.
|
||||
|
||||
### PDF does not reflect recent edits
|
||||
|
||||
- Run summarize with `force=true` after changing the JD/tailoring.
|
||||
- Regenerate PDF after summarize completes.
|
||||
|
||||
### Reopen skipped/applied jobs
|
||||
|
||||
- Patch `status` back to `discovered` to return the job to the active queue.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Pipeline Run](/docs/next/features/pipeline-run)
|
||||
- [Ghostwriter](/docs/next/features/ghostwriter)
|
||||
- [Reactive Resume](/docs/next/features/reactive-resume)
|
||||
- [Post-Application Tracking](/docs/next/features/post-application-tracking)
|
||||
@@ -0,0 +1,73 @@
|
||||
---
|
||||
id: overview
|
||||
title: Overview
|
||||
description: Dashboard analytics for application volume and conversion over selectable time windows.
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
## What it is
|
||||
|
||||
The Overview page is the analytics dashboard for your pipeline outcomes.
|
||||
|
||||

|
||||
|
||||
It visualizes:
|
||||
|
||||
- Applications per day
|
||||
- Application-to-response conversion
|
||||
- Funnel progression (Applied, Screening, Interview, Offer, Rejected)
|
||||
|
||||
### Graph-level views
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Why it exists
|
||||
|
||||
The page helps you measure whether your current sourcing and tailoring approach is producing responses, not just applications.
|
||||
|
||||
Use it to quickly answer:
|
||||
|
||||
- Are application volumes increasing or dropping?
|
||||
- Is response conversion improving?
|
||||
- Where are applications stalling in the funnel?
|
||||
|
||||
## How to use it
|
||||
|
||||
1. Open **Overview**.
|
||||
2. Select a time window (`7d`, `14d`, `30d`, `90d`) in the top-right selector.
|
||||
3. Review:
|
||||
- **Applications per day** for volume trend
|
||||
- **Application → Response Conversion** for quality/outcome trend
|
||||
4. Compare periods and adjust your sourcing terms, filters, or tailoring strategy.
|
||||
|
||||
### Data and calculation defaults
|
||||
|
||||
- Default window is `30d`.
|
||||
- Only jobs in statuses `applied` and `in_progress` are used as input.
|
||||
- Conversion counts any positive response-stage event (for example recruiter screen, assessment, interview stages, or offer).
|
||||
- Conversion trend chart uses a rolling window up to 7 days.
|
||||
|
||||
## Common problems
|
||||
|
||||
### Empty charts
|
||||
|
||||
- Verify you have jobs with `appliedAt` timestamps.
|
||||
- The selected duration may exclude your recent activity.
|
||||
|
||||
### Conversion appears low
|
||||
|
||||
- Conversion only counts jobs that reached response stages.
|
||||
- If stage events are missing or delayed, conversion will under-report.
|
||||
|
||||
### Trend icons look counterintuitive
|
||||
|
||||
- Volume trend compares first-half vs second-half averages in the selected window.
|
||||
- Changing the time window can materially change trend direction.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Orchestrator](/docs/next/features/orchestrator)
|
||||
- [Post-Application Tracking](/docs/next/features/post-application-tracking)
|
||||
- [Troubleshooting](/docs/next/troubleshooting/common-problems)
|
||||
@@ -0,0 +1,118 @@
|
||||
---
|
||||
id: pipeline-run
|
||||
title: Pipeline Run
|
||||
description: How to use Run Mode (Automatic vs Manual), presets, source controls, and advanced run settings.
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
## What it is
|
||||
|
||||
Pipeline Run is the Jobs-page run modal for starting either:
|
||||
|
||||
- an **Automatic** pipeline run
|
||||
- a **Manual** one-job import
|
||||
|
||||
For end-to-end sequence, read [Find Jobs and Apply Workflow](/docs/next/workflows/find-jobs-and-apply-workflow).
|
||||
For manual import internals, read [Manual Import Extractor](/docs/next/extractors/manual).
|
||||
|
||||
## Why it exists
|
||||
|
||||
The modal provides one place to control run volume, source compatibility, and processing aggressiveness before consuming compute/time.
|
||||
|
||||
It helps you:
|
||||
|
||||
- choose speed vs depth with presets
|
||||
- avoid invalid source/country combinations
|
||||
- understand estimated run cost before starting
|
||||
|
||||
## How to use it
|
||||
|
||||
1. Open the Jobs page and use the top-right run control.
|
||||
2. Choose either **Automatic** or **Manual** tab.
|
||||
3. Configure required inputs and start run.
|
||||
|
||||
### Automatic tab
|
||||
|
||||
#### Presets
|
||||
|
||||
Three presets set defaults for run aggressiveness:
|
||||
|
||||
- **Fast**: lower processing volume, higher score threshold
|
||||
- **Balanced**: middle-ground defaults
|
||||
- **Detailed**: higher processing volume, lower score threshold
|
||||
|
||||
If values are edited manually, the UI shows **Custom**.
|
||||
|
||||
#### Country and source compatibility
|
||||
|
||||
- Country selection affects which sources are available.
|
||||
- UK-only sources are disabled for non-UK countries.
|
||||
- Adzuna is available only for its supported countries and when App ID/App Key are configured in Settings.
|
||||
- Glassdoor can be enabled only when:
|
||||
- selected country supports Glassdoor
|
||||
- a **Glassdoor city** is set in Advanced settings
|
||||
|
||||
Incompatible sources are disabled with explanatory tooltips.
|
||||
|
||||
#### Advanced settings
|
||||
|
||||
- **Resumes tailored** (`topN`)
|
||||
- **Min suitability score**
|
||||
- **Max jobs discovered** (run budget cap)
|
||||
- **Glassdoor city** (required only for Glassdoor)
|
||||
|
||||
#### Search terms
|
||||
|
||||
- Add terms with Enter or commas.
|
||||
- Multiple terms increase discovery breadth and runtime.
|
||||
- At least one search term is required.
|
||||
|
||||
#### Estimate and run gating
|
||||
|
||||
The footer estimate shows expected discovered jobs and resume-processing range.
|
||||
|
||||
`Start run now` is disabled when:
|
||||
|
||||
- a run is already in progress
|
||||
- required save/run work is still in progress
|
||||
- no compatible sources are selected
|
||||
- no search terms are present
|
||||
|
||||
### Manual tab
|
||||
|
||||
Manual mode opens direct import flow in the same modal.
|
||||
|
||||
Use it when you already have a specific job description or link and do not want full discovery.
|
||||
|
||||
For accepted input formats, inference behavior, and limits, see [Manual Import Extractor](/docs/next/extractors/manual).
|
||||
|
||||
## Common problems
|
||||
|
||||
### Start button stays disabled
|
||||
|
||||
- Ensure at least one search term is present.
|
||||
- Ensure at least one compatible source is selected.
|
||||
- Wait for active save/run operations to finish.
|
||||
|
||||
### Glassdoor cannot be enabled
|
||||
|
||||
- Verify selected country supports Glassdoor.
|
||||
- Set a Glassdoor city in Advanced settings.
|
||||
|
||||
### Adzuna is not selectable
|
||||
|
||||
- Set `Adzuna App ID` and `Adzuna App Key` in **Settings > Environment & Accounts**.
|
||||
- Verify the selected country is one of Adzuna's supported markets.
|
||||
|
||||
### Run takes longer than expected
|
||||
|
||||
- Reduce term count.
|
||||
- Use `Fast` preset or lower `Max jobs discovered`.
|
||||
- Disable high-cost source combinations where acceptable.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Find Jobs and Apply Workflow](/docs/next/workflows/find-jobs-and-apply-workflow)
|
||||
- [Manual Import Extractor](/docs/next/extractors/manual)
|
||||
- [Orchestrator](/docs/next/features/orchestrator)
|
||||
- [Overview](/docs/next/features/overview)
|
||||
@@ -0,0 +1,93 @@
|
||||
---
|
||||
id: post-application-tracking
|
||||
title: Post-Application Tracking
|
||||
description: Gmail-based tracking inbox, smart routing, and review workflow.
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
The Tracking Inbox monitors Gmail for job-application responses and updates timelines.
|
||||
|
||||

|
||||
|
||||
## Overview
|
||||
|
||||
1. Scans Gmail for recruitment-related emails
|
||||
2. Matches emails to tracked jobs using AI
|
||||
3. Updates timeline/state when confidence is high
|
||||
4. Queues uncertain matches for manual review
|
||||
|
||||
## Smart router flow
|
||||
|
||||
```mermaid
|
||||
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 match]
|
||||
|
||||
C -->|<50%| G{Is it relevant?}
|
||||
G -->|Yes| H[Goes to Inbox as orphan]
|
||||
G -->|No| I[Ignored]
|
||||
```
|
||||
|
||||
## Setup
|
||||
|
||||
### Prerequisites
|
||||
|
||||
1. Gmail account with application emails
|
||||
2. Google OAuth credentials
|
||||
|
||||
### Configure OAuth
|
||||
|
||||
Set:
|
||||
|
||||
```bash
|
||||
GMAIL_OAUTH_CLIENT_ID=your-client-id.apps.googleusercontent.com
|
||||
GMAIL_OAUTH_CLIENT_SECRET=your-client-secret
|
||||
GMAIL_OAUTH_REDIRECT_URI=https://your-domain.com/oauth/gmail/callback
|
||||
```
|
||||
|
||||
Then connect in UI via **Tracking Inbox → Connect Gmail**.
|
||||
|
||||
Detailed setup guide:
|
||||
|
||||
- [Gmail OAuth Setup](/docs/next/getting-started/gmail-oauth-setup)
|
||||
|
||||
## Using the inbox
|
||||
|
||||
- Review pending items in Tracking Inbox
|
||||
- Approve to link/update timeline
|
||||
- Ignore to mark non-relevant
|
||||
|
||||
Confidence interpretation:
|
||||
|
||||
- `95-100%`: auto-processed
|
||||
- `50-94%`: pending review with suggestion
|
||||
- `<50%`: pending review as orphan/ignored
|
||||
|
||||
## Privacy and security
|
||||
|
||||
- Scope requested: `gmail.readonly`
|
||||
- Full scope: `https://www.googleapis.com/auth/gmail.readonly`
|
||||
- Minimal metadata sent for matching
|
||||
- Email data stays local in your instance
|
||||
|
||||
## API reference
|
||||
|
||||
| Method | Endpoint | Description |
|
||||
| ------ | ----------------------------------------- | --------------------- |
|
||||
| GET | `/api/post-application/inbox` | List pending messages |
|
||||
| POST | `/api/post-application/inbox/:id/approve` | Approve message |
|
||||
| POST | `/api/post-application/inbox/:id/deny` | Ignore message |
|
||||
| GET | `/api/post-application/runs` | List sync runs |
|
||||
| GET | `/api/post-application/providers/gmail/oauth/start` | Start OAuth flow |
|
||||
| POST | `/api/post-application/providers/gmail/oauth/exchange` | Exchange OAuth code |
|
||||
|
||||
## Common issues
|
||||
|
||||
- No refresh token: disconnect and reconnect Gmail.
|
||||
- Emails not appearing: check runs, OAuth config, and recruitment subjects.
|
||||
- Wrong matches: expected in lower-confidence buckets; use manual review.
|
||||
@@ -0,0 +1,249 @@
|
||||
---
|
||||
id: reactive-resume
|
||||
title: Reactive Resume
|
||||
description: Configure RxResume integration, base resume selection, and project inclusion behavior for PDF generation.
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
## What it is
|
||||
|
||||
Reactive Resume integration powers JobOps PDF generation.
|
||||
|
||||
JobOps uses a selected RxResume base resume as the source of truth, then applies job-specific tailoring (summary, headline, skills, project visibility) before exporting a PDF.
|
||||
|
||||
## Why it exists
|
||||
|
||||
Most users need a repeatable resume pipeline:
|
||||
|
||||
- one canonical resume source
|
||||
- controlled project inclusion rules
|
||||
- per-job tailored output without manual copy/paste
|
||||
|
||||
Reactive Resume integration provides that workflow end-to-end.
|
||||
|
||||
### Why JobOps uses RxResume (instead of building a new editor)
|
||||
|
||||
RxResume is a mature, established resume product with strong PDF output quality.
|
||||
|
||||
Key reasons:
|
||||
|
||||
- ATS-friendly PDF generation is already excellent and battle-tested.
|
||||
- The editor UX is strong and supports extensive user customization.
|
||||
- It supports many themes out of the box.
|
||||
- It has a JSON-native model (import/export), which is critical for JobOps automation.
|
||||
|
||||
Because RxResume uses structured JSON, JobOps can safely apply LLM-driven updates to specific sections before generating PDFs.
|
||||
|
||||
## Core concepts
|
||||
|
||||
### Base resume
|
||||
|
||||
Your **base resume** is selected in Settings and used for:
|
||||
|
||||
- profile extraction
|
||||
- project catalog extraction
|
||||
- PDF generation
|
||||
|
||||
If no base resume is selected, profile-dependent features and PDF generation cannot run.
|
||||
|
||||
### Project catalog
|
||||
|
||||
JobOps reads projects from `sections.projects.items` in the selected RxResume resume.
|
||||
|
||||
Each project is identified by:
|
||||
|
||||
- `id`
|
||||
- `name`
|
||||
- `description`
|
||||
- `date`
|
||||
- `visible` (visible in base resume)
|
||||
|
||||
### Project selection controls
|
||||
|
||||
The Settings UI supports 3 controls:
|
||||
|
||||
- **Must Include**: always include these projects.
|
||||
- **AI Selectable**: pool of projects AI can pick from.
|
||||
- **Max Projects**: final cap for included projects.
|
||||
|
||||
At generation time:
|
||||
|
||||
1. Must-include projects are added first.
|
||||
2. AI picks up to remaining slots from AI-selectable projects.
|
||||
3. Final visible projects are applied to the generated resume.
|
||||
|
||||
## Setup and configuration
|
||||
|
||||
### Account requirements (important)
|
||||
|
||||
Before connecting Reactive Resume to JobOps:
|
||||
|
||||
1. Create your account on **RxResume v4** at [v4.rxresu.me/auth/register](https://v4.rxresu.me/auth/register).
|
||||
2. Use a **native email + password** account (not Google/GitHub/other OAuth login).
|
||||
3. Generate/store that password so JobOps can use it for API login.
|
||||
|
||||
JobOps cannot use OAuth-based RxResume logins for this integration.
|
||||
|
||||
### 1) Configure RxResume credentials
|
||||
|
||||
Configure in Settings:
|
||||
|
||||
- `rxresumeEmail`
|
||||
- `rxresumePassword`
|
||||
|
||||
Or via environment variables:
|
||||
|
||||
- `RXRESUME_EMAIL`
|
||||
- `RXRESUME_PASSWORD`
|
||||
- optional `RXRESUME_URL` (defaults to `https://v4.rxresu.me`)
|
||||
|
||||
### 2) Select base resume
|
||||
|
||||
In **Settings → Reactive Resume**:
|
||||
|
||||
1. Click refresh to fetch resumes.
|
||||
2. Select the template/base resume.
|
||||
3. Save settings.
|
||||
|
||||
### 3) Configure project behavior
|
||||
|
||||
In the same section:
|
||||
|
||||
1. Set `Max projects`.
|
||||
2. Mark projects as **Must Include** where needed.
|
||||
3. Mark remaining projects as **AI selectable**.
|
||||
4. Save settings.
|
||||
|
||||
## Runtime behavior
|
||||
|
||||
### During PDF generation
|
||||
|
||||
High-level flow:
|
||||
|
||||
1. Load selected base resume from RxResume.
|
||||
2. Apply tailored summary/headline/skills.
|
||||
3. Compute final visible projects from your selection rules.
|
||||
4. Optionally rewrite outbound links to tracer links (per-job toggle).
|
||||
5. Create temporary resume in RxResume.
|
||||
6. Export PDF.
|
||||
7. Delete temporary resume.
|
||||
|
||||
### Per-job tracer links
|
||||
|
||||
Before generating a PDF, each job can enable/disable tracer links.
|
||||
|
||||
- Disabled: original RxResume links remain unchanged.
|
||||
- Enabled: eligible outbound links are rewritten to `https://<your-host>/cv/<company>-xx` (readable slug + 2-letter suffix).
|
||||
|
||||
For background pipeline generation, configure:
|
||||
|
||||
- `JOBOPS_PUBLIC_BASE_URL=https://your-host`
|
||||
|
||||
Important:
|
||||
|
||||
- tracer enablement is gated by readiness checks
|
||||
- if public host verification fails, enable is blocked until host health is restored
|
||||
- toggle changes apply on next PDF generation only
|
||||
|
||||
### What JobOps changes with AI
|
||||
|
||||
Current AI-driven edits are intentionally scoped:
|
||||
|
||||
- `summary`
|
||||
- `headline/title`
|
||||
- `skills` and keywords
|
||||
- project **visibility** (enable/disable per project)
|
||||
|
||||
## API reference
|
||||
|
||||
```bash
|
||||
# Get effective settings (includes resolved resumeProjects and base resume id)
|
||||
curl "http://localhost:3001/api/settings"
|
||||
```
|
||||
|
||||
```bash
|
||||
# Save base resume and project controls
|
||||
curl -X PATCH "http://localhost:3001/api/settings" \
|
||||
-H "content-type: application/json" \
|
||||
-d '{
|
||||
"rxresumeBaseResumeId": "resume_id_here",
|
||||
"resumeProjects": {
|
||||
"maxProjects": 4,
|
||||
"lockedProjectIds": ["proj_a"],
|
||||
"aiSelectableProjectIds": ["proj_b","proj_c","proj_d"]
|
||||
}
|
||||
}'
|
||||
```
|
||||
|
||||
```bash
|
||||
# List available RxResume resumes
|
||||
curl "http://localhost:3001/api/settings/rx-resumes"
|
||||
```
|
||||
|
||||
```bash
|
||||
# Fetch projects from one RxResume resume
|
||||
curl "http://localhost:3001/api/settings/rx-resumes/<resumeId>/projects"
|
||||
```
|
||||
|
||||
```bash
|
||||
# Regenerate PDF for a job after changing settings or resume data
|
||||
curl -X POST "http://localhost:3001/api/jobs/<jobId>/generate-pdf"
|
||||
```
|
||||
|
||||
## Troubleshooting and FAQ
|
||||
|
||||
### RxResume controls are disabled
|
||||
|
||||
- Ensure RxResume credentials are configured.
|
||||
- Save settings, then refresh resumes in the Reactive Resume section.
|
||||
|
||||
### No resumes appear in dropdown
|
||||
|
||||
- Confirm credentials are valid for [v4.rxresu.me](https://v4.rxresu.me)/your configured RxResume URL.
|
||||
- Confirm the RxResume account is a native email/password account (not OAuth-only).
|
||||
- Confirm the selected RxResume account actually has resumes.
|
||||
|
||||
### Project list is empty in settings
|
||||
|
||||
- Root cause is usually the source resume on [rxresu.me](https://rxresu.me) having an empty **Projects** section.
|
||||
- Add projects directly in RxResume first.
|
||||
- Re-select/refresh the base resume in JobOps and regenerate the PDF.
|
||||
|
||||
### Project checkboxes look wrong after changing base resume
|
||||
|
||||
- Save after selecting the new base resume.
|
||||
- Re-open Reactive Resume section and verify project IDs from that resume.
|
||||
- Re-run PDF generation to apply the new project map.
|
||||
|
||||
### Changes did not affect an already generated PDF
|
||||
|
||||
- Settings changes apply to new generation runs.
|
||||
- Regenerate PDFs for already-ready jobs.
|
||||
|
||||
## Best practices
|
||||
|
||||
- Keep base resume projects complete and up to date in RxResume.
|
||||
- Use **Must Include** sparingly for cornerstone projects.
|
||||
- Keep AI-selectable pool broad enough for job-specific relevance.
|
||||
- After major resume edits, regenerate PDFs for active high-priority jobs.
|
||||
|
||||
### Add “context projects” even if they are usually hidden
|
||||
|
||||
The LLM only knows what exists in your resume data.
|
||||
|
||||
That means there is real value in adding additional projects in RxResume, even if you keep them hidden by default:
|
||||
|
||||
- They increase the AI’s context about your skills and range.
|
||||
- They can be toggled on only when relevant to a role.
|
||||
|
||||
Example:
|
||||
|
||||
- If your main background is not Android, but you have one credible Android side project, include it in RxResume, but keep it hidden by default.
|
||||
- For a mobile role, the AI can enable that project automatically based on the job description.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Settings](./settings)
|
||||
- [Orchestrator](./orchestrator)
|
||||
- [Ghostwriter](./ghostwriter)
|
||||
- [Self-Hosting](../getting-started/self-hosting)
|
||||
@@ -0,0 +1,193 @@
|
||||
---
|
||||
id: settings
|
||||
title: Settings
|
||||
description: Configure models, webhooks, accounts, backup behavior, scoring, and safety controls.
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
## What it is
|
||||
|
||||
The Settings page is the control center for app-wide behavior.
|
||||
|
||||

|
||||
|
||||
It lets you configure:
|
||||
|
||||
- LLM provider and models
|
||||
- Webhook destinations and secret
|
||||
- Display and Ghostwriter defaults
|
||||
- Service credentials and basic auth
|
||||
- Reactive Resume project selection
|
||||
- Tracer Links readiness verification
|
||||
- Backup and scoring rules
|
||||
- Data-clearing actions in the Danger Zone
|
||||
|
||||
## Why it exists
|
||||
|
||||
Most teams want stable defaults for repeated workflows, without editing environment variables every time.
|
||||
|
||||
Settings gives you runtime overrides for the key parts of discovery, scoring, tailoring, and post-application automation.
|
||||
|
||||
## How to use it
|
||||
|
||||
1. Open **Settings**.
|
||||
2. Expand each section you want to change.
|
||||
3. Update values and click **Save Changes**.
|
||||
4. Re-run the workflow that uses those settings (for example pipeline runs, Ghostwriter, or resume tailoring) to verify behavior.
|
||||
|
||||
## Section-by-section guide
|
||||
|
||||
### Model
|
||||
|
||||

|
||||
|
||||
- Choose provider (`openrouter`, `lmstudio`, `ollama`, `openai`, `gemini`)
|
||||
- Set provider-specific base URL/API key when required
|
||||
- Configure default model plus task-specific overrides:
|
||||
- Scoring model
|
||||
- Tailoring model
|
||||
- Project-selection model
|
||||
|
||||
### Webhooks
|
||||
|
||||

|
||||
|
||||
- Pipeline status webhook: called on run completion/failure
|
||||
- Job completion webhook: called when a job is marked applied
|
||||
- Optional webhook secret (sent as bearer token)
|
||||
|
||||
### Display Settings
|
||||
|
||||

|
||||
|
||||
- Toggle visa sponsor badge visibility in job lists/details
|
||||
|
||||
### Ghostwriter
|
||||
|
||||

|
||||
|
||||
- Set global writing defaults:
|
||||
- Tone
|
||||
- Formality
|
||||
- Constraints
|
||||
- Do-not-use terms
|
||||
|
||||
### Reactive Resume
|
||||
|
||||

|
||||
|
||||
- Select a template/base resume
|
||||
- Configure project selection behavior:
|
||||
- Max projects
|
||||
- Must-include projects
|
||||
- AI-selectable projects
|
||||
|
||||
### Tracer Links
|
||||
|
||||
- Verify tracer readiness before enabling per-job tracing
|
||||
- Shows current status (`Ready`, `Unavailable`, `Unconfigured`, or stale state)
|
||||
- Displays the effective public base URL and last check time
|
||||
- Provides **Verify now** for an on-demand health check
|
||||
|
||||
Readiness requires:
|
||||
|
||||
- a valid public JobOps base URL
|
||||
- successful reachability of `<public-base-url>/health`
|
||||
- non-localhost/non-private host setup for public redirect usage
|
||||
|
||||
### Environment & Accounts
|
||||
|
||||
- Configure service accounts:
|
||||
- RxResume email/password
|
||||
- UKVisaJobs email/password
|
||||
- Adzuna app ID/app key
|
||||
- Optional basic authentication for write operations
|
||||
|
||||
### Backup
|
||||
|
||||

|
||||
|
||||
- Enable/disable automatic daily backups
|
||||
- Configure backup hour (UTC) and max retained backups
|
||||
- Create or delete backups manually
|
||||
- See [Database Backups](../getting-started/database-backups) for full backup/restore guidance.
|
||||
|
||||
### Scoring Settings
|
||||
|
||||

|
||||
|
||||
- Penalize missing salary data
|
||||
- Set penalty amount
|
||||
- Optional auto-skip threshold for low-score jobs
|
||||
|
||||
### Danger Zone
|
||||
|
||||

|
||||
|
||||
- Clear jobs by selected statuses
|
||||
- Clear jobs below a score threshold
|
||||
- Clear the full database
|
||||
|
||||
## API examples
|
||||
|
||||
```bash
|
||||
# Get effective settings (defaults + overrides)
|
||||
curl "http://localhost:3001/api/settings"
|
||||
```
|
||||
|
||||
```bash
|
||||
# Update settings overrides
|
||||
curl -X PATCH "http://localhost:3001/api/settings" \
|
||||
-H "content-type: application/json" \
|
||||
-d '{
|
||||
"llmProvider": "openrouter",
|
||||
"model": "openai/gpt-4.1-mini",
|
||||
"chatStyleTone": "concise",
|
||||
"showSponsorInfo": true
|
||||
}'
|
||||
```
|
||||
|
||||
```bash
|
||||
# List and create backups (used by the Backup section)
|
||||
curl "http://localhost:3001/api/backups"
|
||||
curl -X POST "http://localhost:3001/api/backups"
|
||||
```
|
||||
|
||||
## Common problems
|
||||
|
||||
### Saved value does not seem to apply
|
||||
|
||||
- Some settings apply only to new runs/actions after save.
|
||||
- Re-run scoring/tailoring/pipeline to validate effect.
|
||||
|
||||
### RxResume controls are disabled
|
||||
|
||||
- Configure RxResume credentials in Environment & Accounts first.
|
||||
- Then refresh available resumes from the Reactive Resume section.
|
||||
|
||||
### RxResume projects look empty in the RxResume UI
|
||||
|
||||
- Root cause: your resume on [rxresu.me](https://rxresu.me) has an empty **Projects** section.
|
||||
- Fix in RxResume first: add project entries to the base resume you selected in Settings.
|
||||
- Then return to JobOps, refresh/select the same base resume in **Reactive Resume**, and regenerate the PDF.
|
||||
- JobOps preserves current visibility state, but it cannot create missing project content if the source resume has no projects.
|
||||
|
||||
### Webhook calls fail
|
||||
|
||||
- Verify URL reachability from the server host.
|
||||
- Confirm auth expectations on the receiver side (including secret/bearer token).
|
||||
|
||||
### Tracer links cannot be enabled
|
||||
|
||||
- Open **Settings → Tracer Links** and click **Verify now**.
|
||||
- Ensure `JOBOPS_PUBLIC_BASE_URL` is set for background/pipeline usage.
|
||||
- Ensure the configured host is publicly reachable and `/health` responds.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Reactive Resume](./reactive-resume)
|
||||
- [Database Backups](../getting-started/database-backups)
|
||||
- [Overview](./overview)
|
||||
- [Orchestrator](./orchestrator)
|
||||
- [Ghostwriter](./ghostwriter)
|
||||
- [Self-Hosting](../getting-started/self-hosting)
|
||||
@@ -0,0 +1,151 @@
|
||||
---
|
||||
id: tracer-links
|
||||
title: Tracer Links
|
||||
description: Track outbound resume-link clicks with per-job toggles and privacy-safe analytics.
|
||||
sidebar_position: 8
|
||||
---
|
||||
|
||||
## What it is
|
||||
|
||||
Tracer Links are per-job redirect links that are generated when a PDF is created.
|
||||
|
||||
When enabled for a job, JobOps rewrites eligible outbound RxResume links to your JobOps host, then redirects to the original destination after recording a click event.
|
||||
|
||||
Examples:
|
||||
|
||||
- original: `https://github.com/yourname`
|
||||
- traced: `https://jobops.dakheera47.com/cv/amazon-de`
|
||||
|
||||
Format details:
|
||||
|
||||
- path prefix is always `/cv/`
|
||||
- token format is `<company-slug>-<xx>`
|
||||
- `<xx>` is two lowercase letters (`a-z`)
|
||||
- visible link text in the PDF is also updated to the traced URL
|
||||
|
||||
## Why it exists
|
||||
|
||||
Without tracer links, resume links are "fire and forget".
|
||||
|
||||
Tracer links let you answer:
|
||||
|
||||
- whether links in a specific job PDF were opened
|
||||
- which destination links are being opened most
|
||||
- rough human vs bot traffic split
|
||||
- per-job and global engagement trends over time
|
||||
|
||||
The feature is privacy-safe by design:
|
||||
|
||||
- no raw IP is stored
|
||||
- referrer host is stored (not full referrer URL)
|
||||
- bot traffic is flagged and can be filtered in analytics
|
||||
|
||||
## How to use it
|
||||
|
||||
1. Open **Settings** and go to the **Tracer Links** section.
|
||||
2. Click **Verify now** and confirm status is **Ready**.
|
||||
3. Open a job in **Jobs**.
|
||||
4. Enable **Tracer links for this job** in tailoring or job details.
|
||||
5. Generate or regenerate the PDF.
|
||||
6. Open **Tracer Links** in navigation to view:
|
||||
- global totals
|
||||
- top jobs and top links
|
||||
- per-job drilldown by Job ID
|
||||
|
||||
Important behavior:
|
||||
|
||||
- Tracer links are **off by default** per job.
|
||||
- Toggle changes apply on the **next PDF generation only**.
|
||||
- Existing PDFs are not modified retroactively.
|
||||
- Existing tracer URLs remain valid, even if a newer PDF generates new links.
|
||||
|
||||
### Readiness and enable/disable behavior
|
||||
|
||||
You can only turn tracer links **on** when readiness is healthy.
|
||||
|
||||
Readiness checks:
|
||||
|
||||
- a resolvable public base URL
|
||||
- a successful health probe to `<public-base-url>/health`
|
||||
- a non-localhost/non-private host for public usage
|
||||
|
||||
If readiness is unavailable, enable is blocked until verification passes.
|
||||
|
||||
### Required background-run setting
|
||||
|
||||
If PDFs are generated by background pipeline runs, set:
|
||||
|
||||
```bash
|
||||
JOBOPS_PUBLIC_BASE_URL=https://your-jobops-host
|
||||
```
|
||||
|
||||
JobOps uses this URL when request host inference is not available.
|
||||
|
||||
### URL uniqueness rules
|
||||
|
||||
Tracer links are unique enough for tracking while still readable.
|
||||
|
||||
- same job + same source path + same destination URL => token is reused
|
||||
- same job + same source path + changed destination URL => new token
|
||||
- old tokens continue to redirect (not retroactively deleted)
|
||||
|
||||
### Risk and responsibility disclaimer
|
||||
|
||||
Tracer links are redirect links. Some recruiters, companies, universities, or security tools may treat redirects as suspicious behavior and may whitelist, blacklist, filter, or flag these links as phishing-like.
|
||||
|
||||
By enabling and using this feature, you accept full responsibility for any consequences that result from its use. Responsibility for policy, trust, and reputation outcomes sits with the user/operator of the instance, not with the app.
|
||||
|
||||
## Common problems
|
||||
|
||||
### I cannot enable tracer links
|
||||
|
||||
Cause:
|
||||
|
||||
- readiness is not **Ready**
|
||||
- host is local/private or unreachable from the verifier
|
||||
|
||||
Fix:
|
||||
|
||||
- configure a real public host
|
||||
- set `JOBOPS_PUBLIC_BASE_URL` for background flows
|
||||
- make sure `<public-base-url>/health` is reachable
|
||||
- retry **Verify now**
|
||||
|
||||
### Tracer links enabled but PDF generation fails
|
||||
|
||||
Cause:
|
||||
|
||||
- base URL cannot be resolved at generation time, or instance health is not reachable for that run
|
||||
|
||||
Fix:
|
||||
|
||||
- ensure `JOBOPS_PUBLIC_BASE_URL` is set correctly
|
||||
- verify the deployment is publicly reachable
|
||||
- regenerate the PDF
|
||||
|
||||
### I enabled tracer links, but old PDF still has direct links
|
||||
|
||||
Cause:
|
||||
|
||||
- toggle changes only apply to newly generated PDFs
|
||||
|
||||
Fix:
|
||||
|
||||
- regenerate the PDF for that job
|
||||
|
||||
### Analytics look inflated by scanners
|
||||
|
||||
Cause:
|
||||
|
||||
- link scanners and preview bots may open links automatically
|
||||
|
||||
Fix:
|
||||
|
||||
- use the **Include likely bots** filter in Tracer Links analytics
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Settings](/docs/features/settings)
|
||||
- [Reactive Resume](/docs/features/reactive-resume)
|
||||
- [Find Jobs and Apply Workflow](/docs/workflows/find-jobs-and-apply-workflow)
|
||||
- [Post-Application Tracking](/docs/features/post-application-tracking)
|
||||
@@ -0,0 +1,74 @@
|
||||
---
|
||||
id: visa-sponsors
|
||||
title: Visa Sponsors
|
||||
description: Search the UK licensed sponsor register and use sponsor matches in your job workflow.
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
## What it is
|
||||
|
||||
The Visa Sponsors page lets you search the UK Home Office licensed sponsor register from inside JobOps.
|
||||
|
||||
For each company, it shows:
|
||||
|
||||
- Match score against your query
|
||||
- Company location (when available)
|
||||
- Licensed routes and type/rating details
|
||||
- Last data refresh time and sponsor count
|
||||
|
||||
## Why it exists
|
||||
|
||||
Many roles require sponsorship-ready employers. This page helps you quickly validate whether a target company appears on the official sponsor list, so you can prioritize applications and sourcing terms.
|
||||
|
||||
## How to use it
|
||||
|
||||
1. Open **Visa Sponsors** in the app.
|
||||
2. Enter a company name in the search box.
|
||||
3. Select a result to view sponsor details.
|
||||
4. Use the score and route details to decide whether to prioritize that employer.
|
||||
|
||||
### Refresh schedule
|
||||
|
||||
- Automatic update runs daily at about **02:00** (server local time).
|
||||
- Use the download/update button in the page header to fetch the latest register immediately.
|
||||
|
||||
### API examples
|
||||
|
||||
```bash
|
||||
# Search sponsors
|
||||
curl -X POST http://localhost:3001/api/visa-sponsors/search \
|
||||
-H "content-type: application/json" \
|
||||
-d '{"query":"Monzo","limit":100,"minScore":20}'
|
||||
```
|
||||
|
||||
```bash
|
||||
# Get one organization's entries (all licensed routes)
|
||||
curl "http://localhost:3001/api/visa-sponsors/organization/Monzo%20Bank%20Ltd"
|
||||
```
|
||||
|
||||
```bash
|
||||
# Trigger manual refresh
|
||||
curl -X POST http://localhost:3001/api/visa-sponsors/update
|
||||
```
|
||||
|
||||
## Common problems
|
||||
|
||||
### No results found
|
||||
|
||||
- Try alternate legal names (`Ltd`, `Limited`, abbreviations).
|
||||
- Reduce spelling strictness by searching a shorter core name.
|
||||
|
||||
### Sponsor data is empty
|
||||
|
||||
- Run a manual refresh with the header update button (or `POST /api/visa-sponsors/update`).
|
||||
- Check that the server can reach `gov.uk` and `assets.publishing.service.gov.uk`.
|
||||
|
||||
### Company appears once but has multiple routes
|
||||
|
||||
- Open the detail panel for that company; route/type entries are shown there.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Orchestrator](/docs/next/features/orchestrator)
|
||||
- [Post-Application Tracking](/docs/next/features/post-application-tracking)
|
||||
- [Self-Hosting](/docs/next/getting-started/self-hosting)
|
||||
Reference in New Issue
Block a user