A CLI tool to search and rank remote job opportunities across multiple sources using LLM-powered analysis.
- Features
- Sources
- Installation
- Quick Start
- Applicant Profiles
- Configuration
- CLI Reference
- Authentication Notes
- Development
- 17 sources - job boards, company directories, ATS platforms, and aggregators
- Async scraping - all sources queried in parallel for speed
- LLM ranking - jobs ranked 0-10 via any OpenAI-compatible API (local or cloud)
- Deduplication - cross-source duplicate removal
- Flexible Output - stdout, JSON, or CSV
- Configurable - YAML config file with credentials, keywords, and LLM settings
| Source | Type | Auth |
|---|---|---|
| WeWorkRemotely | Job board | No |
| RemoteOK | Job board (API) | No |
| Remotive | Job board (API) | No |
| Jobspresso | Job board | No |
| Otta | Job board | Google SSO / cookies |
| Wellfound | Job board | Google SSO / cookies |
| Himalayas | Job board (API) | No |
| HN Who is Hiring | Community thread | No |
| RemoteOK Companies | Company directory | No |
| Himalayas Companies | Company directory | No |
| GitHub established-remote | Curated list | No |
| Job board | Cookies | |
| Indeed | Job board | No |
| Glassdoor | Job board | Cookies |
| Ashby (ATS) | Per-company boards | No |
| Greenhouse (ATS) | Per-company boards | No |
| Lever (ATS) | Per-company boards | No |
pip install -e .# Generate a config template
rjobs --init-config
# Edit config with your preferences
$EDITOR ~/.config/rjobs/config.yml
# Generate an applicant profile
rjobs --parse-resume /path/to/resume.pdf --profile my_profile
# Search all sources
rjobs --profile my_profile
# Search specific sources with extra keywords
rjobs --sources remoteok remotive himalayas --keywords "python" "backend"
# Skip LLM ranking and output JSON
rjobs --no-rank --format json
# Export to file
rjobs --export results.json
rjobs --export results.csvApplicant profiles let the ranking step use your background and preferences instead of scoring jobs generically.
- Parse a resume or LinkedIn profile into a structured applicant summary
- Store target roles, skills, experience areas, education, preferences, and role keywords
- Inject that profile into the LLM ranking prompt when you run searches with ranking enabled
- Automatically append the profile's
role_keywordsto the search keywords, so scrapers query for roles relevant to your background
If the selected profile does not exist, job ranking still runs, but without profile personalization or extra role keywords.
- PDF resumes
- Markdown resumes
- Plain-text resumes
- LinkedIn profile URLs
# Create or overwrite the default profile
rjobs --parse-resume /path/to/resume.pdf
# Save to a named profile
rjobs --parse-resume /path/to/resume.md --profile backend
# Build a profile from LinkedIn instead of a local file
rjobs --parse-resume https://www.linkedin.com/in/your-name/ --profile backendProfiles are saved under ~/.cache/rjobs/profiles/<name>.yml.
# Use the default profile
rjobs
# Use a named profile
rjobs --profile backend
# Search specific sources with a named profile
rjobs --profile backend --sources remoteok greenhouse leverThe --profile flag is used in two places:
- with
--parse-resume, it controls the output profile name - during normal searches, it selects which saved profile to inject into ranking
The config file lives at ~/.config/rjobs/config.yml by default. Generate a template with:
rjobs --init-config
# or specify a custom path
rjobs --init-config /path/to/config.ymlcredentials - Login details for auth-required sources. Google credentials are used for SSO on sites that support it. Browser session cookies are loaded from ~/.config/rjobs/cookies/ (see below).
llm - OpenAI-compatible API endpoint. Works with OpenAI, Ollama, vLLM, llama.cpp server, LM Studio, etc.
search.keywords - Default search terms. Extra keywords can be added via --keywords.
sources.ats_companies - Company slugs for Ashby, Greenhouse, and Lever ATS boards.
ranking - Threshold and system prompt for LLM ranking.
rjobs [OPTIONS]
| Option | Description |
|---|---|
-h, --help |
Show the built-in help text and exit. |
--version |
Show the installed rjobs version and exit. |
--config CONFIG |
Path to config.yml. Defaults to ~/.config/rjobs/config.yml. |
--init-config [PATH] |
Generate a template config file and exit. If PATH is omitted, the default config path is used. |
--sources SOURCE [SOURCE ...] |
Limit the run to specific source IDs. |
--format {table,json,csv} |
Output format for stdout. Default: table. |
--max-results MAX_RESULTS |
Limit the number of displayed results after ranking and filtering. |
--max-listings MAX_LISTINGS |
Randomly sample listings to this count before ranking. Useful for debugging or limiting LLM costs. |
--threshold THRESHOLD |
Minimum ranking threshold from 0 to 10. Overrides ranking.threshold from config. |
--no-rank |
Skip LLM ranking entirely. Results are still scraped, deduplicated, and output. |
--export FILE |
Export results to a file. .json and .csv are inferred from the extension. |
--parse-resume FILE_OR_URL |
Parse a resume file or LinkedIn profile URL and save an applicant profile, then exit. |
--profile NAME |
Profile name to save when using --parse-resume, or to load during ranking. Default: default. |
--show-reasoning |
Include LLM reasoning in table output. |
-v, --verbose |
Increase log verbosity. Use -v for INFO and -vv for DEBUG. |
For sites requiring auth (Otta, Wellfound, LinkedIn, Glassdoor):
-
Google SSO - The tool attempts HTTP-based Google SSO login. Due to bot detection, this may not work reliably. Best used when available.
-
Session cookies - Export cookies from your browser and place them in individual files under
~/.config/rjobs/cookies/. Runrjobs --init-cookiesto create template files with instructions. Each site gets its own file (e.g.~/.config/rjobs/cookies/linkedin). This is the most reliable fallback, and cookies are kept separate from the main config since they expire frequently. -
Direct login - Email/password login is attempted for sites that support it.
If auth fails, the scraper for that source is skipped with a warning.
pip install -e ".[dev]"
pre-commit install