Commands

Commands #

Full CLI reference for every raven subcommand. Run ./raven <command> --help anytime for flags.

Pages in this section #

setup

raven setup #

First-time installation and config seeding.

raven setup

Installs npm dependencies (root + jobs/) and creates:

  • .env from .env.example
  • config/portals.yml from example
  • config/profile.yml from example
  • config/outreach.yml from example
  • files/resume.md from example

Safe to re-run — existing files are not overwritten.

discover

raven discover #

Unified job search across ATS APIs, board feeds, and optional local index.

Architecture: How discovery works — tiers, reverse ATS scan, WebSearch status.

Usage #

raven discover [options]
raven discover --q "backend engineer" --loc Remote --since 7
raven discover --sources boards --since 7
raven discover --json

Behavior #

  • Not open-web search — fetches public JSON APIs and board feeds (see how it works)
  • Loads title/location filters from config/portals.yml by default
  • CLI flags (--q, --loc, …) extend config filters
  • Runs tiers in parallel
  • Deduplicates by canonical job URL
  • Auto-saves results to data/jobs.json (unless --no-save)
  • Prints Next: raven draft --max 25 when complete

Flags #

FlagDescriptionDefault
--q "keywords"Title must match (comma-separated)from portals.yml
--not "words"Title must not containfrom portals.yml
--loc Remote,EULocation allow-listfrom portals.yml
--noloc "X"Location block-listfrom portals.yml
--home "City"Location always-allow
--since NPostings from last N days7
--sourcesats, boards, index, hiringcafeats,boards,index
--atsSubset of ATS platformsall 12
--limit NMax companies per ATS150
--max NMax total results1000
--save PATHCustom save pathdata/jobs.json
--no-saveSkip writing JSON
--jsonMachine-readable stdout
--streamNDJSON stream (for tooling)
--verboseExtra tier/child logs
--quietSummary only
--no-logDisable data/logs/ file

Output JSON shape #

{
  "count": 42,
  "rawMatches": 120,
  "deduped": 78,
  "offers": [
    {
      "url": "https://…",
      "company": "Acme",
      "title": "Backend Engineer",
      "location": "Remote",
      "postedAt": "2026-07-04",
      "ats": "greenhouse",
      "source": "greenhouse-full"
    }
  ],
  "savedAt": "2026-07-04T08:47:54.000Z"
}

Tips #

  • Always set title filters in portals.yml — empty filters match every job
  • Use --sources boards for quick tests (~3s vs ~1min full scan)
  • Run raven sync-jobs before using --sources index

See Job sources for platform details.

draft

raven draft #

Generate tailored application drafts from discovered jobs.

Usage #

raven draft --max 25
raven draft --input data/jobs.json --max 25
raven draft --q "backend engineer" --since 7 --max 20
raven draft --gemini

Input sources #

MethodCommand
Latest discover (default)raven draft → reads data/jobs.json
Explicit fileraven draft --input data/jobs.json
Inline discover + draftraven draft --q "engineer" --since 7

Output files #

FilePurpose
drafts/outreach-YYYY-MM-DD.csvSpreadsheet — review, edit, send
drafts/outreach-YYYY-MM-DD.mdHuman-readable review
drafts/outreach-YYYY-MM-DD.xlsxOptional (--xlsx)

CSV columns #

ColumnDescription
application_typeemail or form
application_labelHuman label
contact_emailFor email rows (often blank — fill manually)
subjectEmail subject or form title
bodyEmail body or short form guide
company, title, job_urlJob metadata
jd_keywordsTerms extracted from job title
action_wordsSuggested verbs for this role
tailored_bulletsResume bullets matched to JD
form_stepsFull ATS guide (form jobs)
links_blockYour portfolio/GitHub/LinkedIn line
ai_draftyes, no, or fallback
disclaimerReview-before-submit reminder

Flags #

FlagDescription
--input PATHJobs JSON (default: data/jobs.json)
--max NMax drafts to generate
--geminiAI-polish email drafts (needs GEMINI_API_KEY)
--guess-emailSuggest careers@ from apply URL domain
--refresh-resumeRe-parse resume (ignore cache)
--xlsxAlso write Excel
--no-markdownSkip .md review file
--output PATHCustom output base path

Application types #

Form (application_type: form) #

Greenhouse, Lever, Ashby, Workday, and similar ATS listings. Raven generates step-by-step guides with your links and tailored bullets — not sendable email.

send

raven send #

Send outreach emails from a CSV or XLSX file via Gmail or Outlook.

Prerequisites #

raven auth-gmail    # or auth-outlook

Configure in .env:

SENDER_NAME=Your Name
SENDER_EMAIL=you@example.com
GOOGLE_CLIENT_ID=GOOGLE_CLIENT_SECRET=GMAIL_REFRESH_TOKEN=

Usage #

raven send --input drafts/outreach-2026-07-04.csv --dry-run
raven send --input drafts/outreach-2026-07-04.csv --delay 60 --limit 20
raven send --provider outlook --input contacts.xlsx

Required CSV columns #

ColumnDescription
contact_emailRecipient (or email)
subjectEmail subject
bodyPlain-text body

Extra columns (company, job_url, etc.) are ignored by the sender.

sync-jobs

raven sync-jobs #

Download openjobdata daily deltas into a local SQLite index.

Usage #

raven sync-jobs
raven sync-jobs --days 3

What it does #

  1. Syncs companies registry from HuggingFace bucket
  2. Downloads recent daily parquet deltas
  3. Upserts into data/jobs.db
  4. Exports ATS company slug lists to data/cache/ats-companies/

Environment #

If you get HTTP 401:

# .env
HF_TOKEN=hf_xxxxxxxx

After sync #

raven discover --sources index --q "engineer"
raven query --q "ML engineer" --since 7

Flags #

FlagDescription
--days NNumber of daily deltas to fetch
--fullFull backfill (slow)
--no-export-atsSkip ATS slug export

See openjobdata for details.

scan-ats

raven scan-ats #

Live ATS reverse scan only (without board feeds or index).

raven scan-ats --q "software engineer" --since 7
raven scan-ats --ats greenhouse,lever,ashby --json
raven scan-ats --use-portals --dry-run

Uses filters from CLI flags or --use-portals to read config/portals.yml directly.

Platforms: Greenhouse, Lever, Ashby, Workday, Rippling, Workable, BambooHR, SmartRecruiters, Recruitee, Pinpoint, Teamtailor, Personio.

For unified search, prefer raven discover --sources ats.

scan-boards

raven scan-boards #

Board feed scan only (RemoteOK, Remotive, Arbeitnow, Landing.jobs).

raven scan-boards --q "software engineer"
raven scan-boards --q engineer --loc Remote --json

Faster than full ATS walk — good for remote-first roles.

For unified search, prefer raven discover --sources boards.

query

raven query #

Search the local openjobdata SQLite index.

raven query --q "software engineer" --since 7
raven query --q "designer" --ats greenhouse,lever --json

Requires data/jobs.db from raven sync-jobs.

Same filter semantics as discover (--q, --not, --loc, --since, --ats, --max).

auth-gmail / auth-outlook

OAuth setup #

One-time OAuth for email sending.

Gmail #

# Set in .env first:
# GOOGLE_CLIENT_ID=
# GOOGLE_CLIENT_SECRET=

raven auth-gmail

Saves GMAIL_REFRESH_TOKEN to .env.

Outlook #

# Set in .env first:
# MS_CLIENT_ID=
# MS_CLIENT_SECRET=

raven auth-outlook

Saves refresh token to .env.

Send #

raven send --provider gmail --input drafts/outreach.csv --dry-run
raven send --provider outlook --input drafts/outreach.csv

See Environment variables for all .env keys.

Command map #

CommandPurpose
raven setupFirst-time install and config seeding
raven discoverUnified job search (ATS + boards + index)
raven draftTailored application drafts from jobs
raven sendSend outreach emails from CSV/XLSX
raven sync-jobsDownload openjobdata into local SQLite
raven scan-atsLive ATS scan only
raven scan-boardsBoard feed scan only
raven querySearch local jobs.db index
raven auth-gmailOne-time Gmail OAuth
raven auth-outlookOne-time Outlook OAuth

Typical workflow #

./raven setup
./raven discover --q "software engineer" --since 7
./raven draft --max 25
./raven send --input drafts/outreach-2026-07-04.csv --dry-run

Logging flags (all job commands) #

FlagEffect
(default)Live progress + log file in data/logs/
--verboseExtra detail per source
--quietOne-line summary
--no-logDisable log file

Start with discover →