<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Commands on Raven</title><link>https://raven.nopejs.me/docs/commands/</link><description>Recent content in Commands on Raven</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://raven.nopejs.me/docs/commands/index.xml" rel="self" type="application/rss+xml"/><item><title>setup</title><link>https://raven.nopejs.me/docs/commands/setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/commands/setup/</guid><description>&lt;h1 id="raven-setup">
 raven setup
 &lt;a class="anchor" href="#raven-setup">#&lt;/a>
&lt;/h1>
&lt;p>First-time installation and config seeding.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>raven setup
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Installs npm dependencies (root + &lt;code>jobs/&lt;/code>) and creates:&lt;/p>
&lt;ul>
&lt;li>&lt;code>.env&lt;/code> from &lt;code>.env.example&lt;/code>&lt;/li>
&lt;li>&lt;code>config/portals.yml&lt;/code> from example&lt;/li>
&lt;li>&lt;code>config/profile.yml&lt;/code> from example&lt;/li>
&lt;li>&lt;code>config/outreach.yml&lt;/code> from example&lt;/li>
&lt;li>&lt;code>files/resume.md&lt;/code> from example&lt;/li>
&lt;/ul>
&lt;p>Safe to re-run — existing files are not overwritten.&lt;/p></description></item><item><title>discover</title><link>https://raven.nopejs.me/docs/commands/discover/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/commands/discover/</guid><description>&lt;h1 id="raven-discover">
 raven discover
 &lt;a class="anchor" href="#raven-discover">#&lt;/a>
&lt;/h1>
&lt;p>Unified job search across ATS APIs, board feeds, and optional local index.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Architecture:&lt;/strong> &lt;a href="../job-discovery/how-it-works/">How discovery works&lt;/a> — tiers, reverse ATS scan, WebSearch status.&lt;/p>&lt;/blockquote>
&lt;h2 id="usage">
 Usage
 &lt;a class="anchor" href="#usage">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>raven discover &lt;span style="color:#f92672">[&lt;/span>options&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven discover --q &lt;span style="color:#e6db74">&amp;#34;backend engineer&amp;#34;&lt;/span> --loc Remote --since &lt;span style="color:#ae81ff">7&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven discover --sources boards --since &lt;span style="color:#ae81ff">7&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven discover --json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="behavior">
 Behavior
 &lt;a class="anchor" href="#behavior">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Not open-web search&lt;/strong> — fetches public JSON APIs and board feeds (see &lt;a href="../job-discovery/how-it-works/">how it works&lt;/a>)&lt;/li>
&lt;li>Loads title/location filters from &lt;strong>&lt;code>config/portals.yml&lt;/code>&lt;/strong> by default&lt;/li>
&lt;li>CLI flags (&lt;code>--q&lt;/code>, &lt;code>--loc&lt;/code>, …) &lt;strong>extend&lt;/strong> config filters&lt;/li>
&lt;li>Runs tiers &lt;strong>in parallel&lt;/strong>&lt;/li>
&lt;li>Deduplicates by canonical job URL&lt;/li>
&lt;li>&lt;strong>Auto-saves&lt;/strong> results to &lt;code>data/jobs.json&lt;/code> (unless &lt;code>--no-save&lt;/code>)&lt;/li>
&lt;li>Prints &lt;code>Next: raven draft --max 25&lt;/code> when complete&lt;/li>
&lt;/ul>
&lt;h2 id="flags">
 Flags
 &lt;a class="anchor" href="#flags">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Flag&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>--q &amp;quot;keywords&amp;quot;&lt;/code>&lt;/td>
 &lt;td>Title must match (comma-separated)&lt;/td>
 &lt;td>from &lt;code>portals.yml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--not &amp;quot;words&amp;quot;&lt;/code>&lt;/td>
 &lt;td>Title must not contain&lt;/td>
 &lt;td>from &lt;code>portals.yml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--loc Remote,EU&lt;/code>&lt;/td>
 &lt;td>Location allow-list&lt;/td>
 &lt;td>from &lt;code>portals.yml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--noloc &amp;quot;X&amp;quot;&lt;/code>&lt;/td>
 &lt;td>Location block-list&lt;/td>
 &lt;td>from &lt;code>portals.yml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--home &amp;quot;City&amp;quot;&lt;/code>&lt;/td>
 &lt;td>Location always-allow&lt;/td>
 &lt;td>—&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--since N&lt;/code>&lt;/td>
 &lt;td>Postings from last N days&lt;/td>
 &lt;td>&lt;code>7&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--sources&lt;/code>&lt;/td>
 &lt;td>&lt;code>ats&lt;/code>, &lt;code>boards&lt;/code>, &lt;code>index&lt;/code>, &lt;code>hiringcafe&lt;/code>&lt;/td>
 &lt;td>&lt;code>ats,boards,index&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--ats&lt;/code>&lt;/td>
 &lt;td>Subset of ATS platforms&lt;/td>
 &lt;td>all 12&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--limit N&lt;/code>&lt;/td>
 &lt;td>Max companies per ATS&lt;/td>
 &lt;td>&lt;code>150&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--max N&lt;/code>&lt;/td>
 &lt;td>Max total results&lt;/td>
 &lt;td>&lt;code>1000&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--save PATH&lt;/code>&lt;/td>
 &lt;td>Custom save path&lt;/td>
 &lt;td>&lt;code>data/jobs.json&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--no-save&lt;/code>&lt;/td>
 &lt;td>Skip writing JSON&lt;/td>
 &lt;td>—&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--json&lt;/code>&lt;/td>
 &lt;td>Machine-readable stdout&lt;/td>
 &lt;td>—&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--stream&lt;/code>&lt;/td>
 &lt;td>NDJSON stream (for tooling)&lt;/td>
 &lt;td>—&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--verbose&lt;/code>&lt;/td>
 &lt;td>Extra tier/child logs&lt;/td>
 &lt;td>—&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--quiet&lt;/code>&lt;/td>
 &lt;td>Summary only&lt;/td>
 &lt;td>—&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--no-log&lt;/code>&lt;/td>
 &lt;td>Disable &lt;code>data/logs/&lt;/code> file&lt;/td>
 &lt;td>—&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="output-json-shape">
 Output JSON shape
 &lt;a class="anchor" href="#output-json-shape">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;count&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">42&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;rawMatches&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">120&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;deduped&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">78&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;offers&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://…&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;company&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Acme&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;title&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Backend Engineer&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;location&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Remote&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;postedAt&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;2026-07-04&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;ats&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;greenhouse&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;greenhouse-full&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;savedAt&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;2026-07-04T08:47:54.000Z&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="tips">
 Tips
 &lt;a class="anchor" href="#tips">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Always set title filters&lt;/strong> in &lt;code>portals.yml&lt;/code> — empty filters match every job&lt;/li>
&lt;li>Use &lt;code>--sources boards&lt;/code> for quick tests (~3s vs ~1min full scan)&lt;/li>
&lt;li>Run &lt;code>raven sync-jobs&lt;/code> before using &lt;code>--sources index&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>See &lt;a href="../job-discovery/sources/">Job sources&lt;/a> for platform details.&lt;/p></description></item><item><title>draft</title><link>https://raven.nopejs.me/docs/commands/draft/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/commands/draft/</guid><description>&lt;h1 id="raven-draft">
 raven draft
 &lt;a class="anchor" href="#raven-draft">#&lt;/a>
&lt;/h1>
&lt;p>Generate tailored application drafts from discovered jobs.&lt;/p>
&lt;h2 id="usage">
 Usage
 &lt;a class="anchor" href="#usage">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>raven draft --max &lt;span style="color:#ae81ff">25&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven draft --input data/jobs.json --max &lt;span style="color:#ae81ff">25&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven draft --q &lt;span style="color:#e6db74">&amp;#34;backend engineer&amp;#34;&lt;/span> --since &lt;span style="color:#ae81ff">7&lt;/span> --max &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven draft --gemini
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="input-sources">
 Input sources
 &lt;a class="anchor" href="#input-sources">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Method&lt;/th>
 &lt;th>Command&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Latest discover (default)&lt;/td>
 &lt;td>&lt;code>raven draft&lt;/code> → reads &lt;code>data/jobs.json&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Explicit file&lt;/td>
 &lt;td>&lt;code>raven draft --input data/jobs.json&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Inline discover + draft&lt;/td>
 &lt;td>&lt;code>raven draft --q &amp;quot;engineer&amp;quot; --since 7&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="output-files">
 Output files
 &lt;a class="anchor" href="#output-files">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>File&lt;/th>
 &lt;th>Purpose&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>drafts/outreach-YYYY-MM-DD.csv&lt;/code>&lt;/td>
 &lt;td>Spreadsheet — review, edit, send&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>drafts/outreach-YYYY-MM-DD.md&lt;/code>&lt;/td>
 &lt;td>Human-readable review&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>drafts/outreach-YYYY-MM-DD.xlsx&lt;/code>&lt;/td>
 &lt;td>Optional (&lt;code>--xlsx&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="csv-columns">
 CSV columns
 &lt;a class="anchor" href="#csv-columns">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Column&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>application_type&lt;/code>&lt;/td>
 &lt;td>&lt;code>email&lt;/code> or &lt;code>form&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>application_label&lt;/code>&lt;/td>
 &lt;td>Human label&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>contact_email&lt;/code>&lt;/td>
 &lt;td>For email rows (often blank — fill manually)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>subject&lt;/code>&lt;/td>
 &lt;td>Email subject or form title&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>body&lt;/code>&lt;/td>
 &lt;td>Email body or short form guide&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>company&lt;/code>, &lt;code>title&lt;/code>, &lt;code>job_url&lt;/code>&lt;/td>
 &lt;td>Job metadata&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>jd_keywords&lt;/code>&lt;/td>
 &lt;td>Terms extracted from job title&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>action_words&lt;/code>&lt;/td>
 &lt;td>Suggested verbs for this role&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>tailored_bullets&lt;/code>&lt;/td>
 &lt;td>Resume bullets matched to JD&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>form_steps&lt;/code>&lt;/td>
 &lt;td>Full ATS guide (form jobs)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>links_block&lt;/code>&lt;/td>
 &lt;td>Your portfolio/GitHub/LinkedIn line&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>ai_draft&lt;/code>&lt;/td>
 &lt;td>&lt;code>yes&lt;/code>, &lt;code>no&lt;/code>, or &lt;code>fallback&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>disclaimer&lt;/code>&lt;/td>
 &lt;td>Review-before-submit reminder&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="flags">
 Flags
 &lt;a class="anchor" href="#flags">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Flag&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>--input PATH&lt;/code>&lt;/td>
 &lt;td>Jobs JSON (default: &lt;code>data/jobs.json&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--max N&lt;/code>&lt;/td>
 &lt;td>Max drafts to generate&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--gemini&lt;/code>&lt;/td>
 &lt;td>AI-polish email drafts (needs &lt;code>GEMINI_API_KEY&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--guess-email&lt;/code>&lt;/td>
 &lt;td>Suggest &lt;code>careers@&lt;/code> from apply URL domain&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--refresh-resume&lt;/code>&lt;/td>
 &lt;td>Re-parse resume (ignore cache)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--xlsx&lt;/code>&lt;/td>
 &lt;td>Also write Excel&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--no-markdown&lt;/code>&lt;/td>
 &lt;td>Skip &lt;code>.md&lt;/code> review file&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--output PATH&lt;/code>&lt;/td>
 &lt;td>Custom output base path&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="application-types">
 Application types
 &lt;a class="anchor" href="#application-types">#&lt;/a>
&lt;/h2>
&lt;h3 id="form-application_type-form">
 Form (&lt;code>application_type: form&lt;/code>)
 &lt;a class="anchor" href="#form-application_type-form">#&lt;/a>
&lt;/h3>
&lt;p>Greenhouse, Lever, Ashby, Workday, and similar ATS listings. Raven generates &lt;strong>step-by-step guides&lt;/strong> with your links and tailored bullets — not sendable email.&lt;/p></description></item><item><title>send</title><link>https://raven.nopejs.me/docs/commands/send/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/commands/send/</guid><description>&lt;h1 id="raven-send">
 raven send
 &lt;a class="anchor" href="#raven-send">#&lt;/a>
&lt;/h1>
&lt;p>Send outreach emails from a CSV or XLSX file via Gmail or Outlook.&lt;/p>
&lt;h2 id="prerequisites">
 Prerequisites
 &lt;a class="anchor" href="#prerequisites">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>raven auth-gmail &lt;span style="color:#75715e"># or auth-outlook&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Configure in &lt;code>.env&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>SENDER_NAME&lt;span style="color:#f92672">=&lt;/span>Your Name
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>SENDER_EMAIL&lt;span style="color:#f92672">=&lt;/span>you@example.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>GOOGLE_CLIENT_ID&lt;span style="color:#f92672">=&lt;/span>…
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>GOOGLE_CLIENT_SECRET&lt;span style="color:#f92672">=&lt;/span>…
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>GMAIL_REFRESH_TOKEN&lt;span style="color:#f92672">=&lt;/span>…
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="usage">
 Usage
 &lt;a class="anchor" href="#usage">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>raven send --input drafts/outreach-2026-07-04.csv --dry-run
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven send --input drafts/outreach-2026-07-04.csv --delay &lt;span style="color:#ae81ff">60&lt;/span> --limit &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven send --provider outlook --input contacts.xlsx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="required-csv-columns">
 Required CSV columns
 &lt;a class="anchor" href="#required-csv-columns">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Column&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>contact_email&lt;/code>&lt;/td>
 &lt;td>Recipient (or &lt;code>email&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>subject&lt;/code>&lt;/td>
 &lt;td>Email subject&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>body&lt;/code>&lt;/td>
 &lt;td>Plain-text body&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Extra columns (company, job_url, etc.) are ignored by the sender.&lt;/p></description></item><item><title>sync-jobs</title><link>https://raven.nopejs.me/docs/commands/sync-jobs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/commands/sync-jobs/</guid><description>&lt;h1 id="raven-sync-jobs">
 raven sync-jobs
 &lt;a class="anchor" href="#raven-sync-jobs">#&lt;/a>
&lt;/h1>
&lt;p>Download openjobdata daily deltas into a local SQLite index.&lt;/p>
&lt;h2 id="usage">
 Usage
 &lt;a class="anchor" href="#usage">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>raven sync-jobs
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven sync-jobs --days &lt;span style="color:#ae81ff">3&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="what-it-does">
 What it does
 &lt;a class="anchor" href="#what-it-does">#&lt;/a>
&lt;/h2>
&lt;ol>
&lt;li>Syncs companies registry from HuggingFace bucket&lt;/li>
&lt;li>Downloads recent daily parquet deltas&lt;/li>
&lt;li>Upserts into &lt;code>data/jobs.db&lt;/code>&lt;/li>
&lt;li>Exports ATS company slug lists to &lt;code>data/cache/ats-companies/&lt;/code>&lt;/li>
&lt;/ol>
&lt;h2 id="environment">
 Environment
 &lt;a class="anchor" href="#environment">#&lt;/a>
&lt;/h2>
&lt;p>If you get HTTP 401:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># .env&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>HF_TOKEN&lt;span style="color:#f92672">=&lt;/span>hf_xxxxxxxx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="after-sync">
 After sync
 &lt;a class="anchor" href="#after-sync">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>raven discover --sources index --q &lt;span style="color:#e6db74">&amp;#34;engineer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven query --q &lt;span style="color:#e6db74">&amp;#34;ML engineer&amp;#34;&lt;/span> --since &lt;span style="color:#ae81ff">7&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="flags">
 Flags
 &lt;a class="anchor" href="#flags">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Flag&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>--days N&lt;/code>&lt;/td>
 &lt;td>Number of daily deltas to fetch&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--full&lt;/code>&lt;/td>
 &lt;td>Full backfill (slow)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--no-export-ats&lt;/code>&lt;/td>
 &lt;td>Skip ATS slug export&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>See &lt;a href="../job-discovery/openjobdata/">openjobdata&lt;/a> for details.&lt;/p></description></item><item><title>scan-ats</title><link>https://raven.nopejs.me/docs/commands/scan-ats/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/commands/scan-ats/</guid><description>&lt;h1 id="raven-scan-ats">
 raven scan-ats
 &lt;a class="anchor" href="#raven-scan-ats">#&lt;/a>
&lt;/h1>
&lt;p>Live ATS reverse scan only (without board feeds or index).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>raven scan-ats --q &lt;span style="color:#e6db74">&amp;#34;software engineer&amp;#34;&lt;/span> --since &lt;span style="color:#ae81ff">7&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven scan-ats --ats greenhouse,lever,ashby --json
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven scan-ats --use-portals --dry-run
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Uses filters from CLI flags or &lt;code>--use-portals&lt;/code> to read &lt;code>config/portals.yml&lt;/code> directly.&lt;/p>
&lt;p>Platforms: Greenhouse, Lever, Ashby, Workday, Rippling, Workable, BambooHR, SmartRecruiters, Recruitee, Pinpoint, Teamtailor, Personio.&lt;/p>
&lt;p>For unified search, prefer &lt;code>raven discover --sources ats&lt;/code>.&lt;/p></description></item><item><title>scan-boards</title><link>https://raven.nopejs.me/docs/commands/scan-boards/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/commands/scan-boards/</guid><description>&lt;h1 id="raven-scan-boards">
 raven scan-boards
 &lt;a class="anchor" href="#raven-scan-boards">#&lt;/a>
&lt;/h1>
&lt;p>Board feed scan only (RemoteOK, Remotive, Arbeitnow, Landing.jobs).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>raven scan-boards --q &lt;span style="color:#e6db74">&amp;#34;software engineer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven scan-boards --q engineer --loc Remote --json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Faster than full ATS walk — good for remote-first roles.&lt;/p>
&lt;p>For unified search, prefer &lt;code>raven discover --sources boards&lt;/code>.&lt;/p></description></item><item><title>query</title><link>https://raven.nopejs.me/docs/commands/query/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/commands/query/</guid><description>&lt;h1 id="raven-query">
 raven query
 &lt;a class="anchor" href="#raven-query">#&lt;/a>
&lt;/h1>
&lt;p>Search the local openjobdata SQLite index.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>raven query --q &lt;span style="color:#e6db74">&amp;#34;software engineer&amp;#34;&lt;/span> --since &lt;span style="color:#ae81ff">7&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven query --q &lt;span style="color:#e6db74">&amp;#34;designer&amp;#34;&lt;/span> --ats greenhouse,lever --json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Requires &lt;code>data/jobs.db&lt;/code> from &lt;code>raven sync-jobs&lt;/code>.&lt;/p>
&lt;p>Same filter semantics as discover (&lt;code>--q&lt;/code>, &lt;code>--not&lt;/code>, &lt;code>--loc&lt;/code>, &lt;code>--since&lt;/code>, &lt;code>--ats&lt;/code>, &lt;code>--max&lt;/code>).&lt;/p></description></item><item><title>auth-gmail / auth-outlook</title><link>https://raven.nopejs.me/docs/commands/auth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/commands/auth/</guid><description>&lt;h1 id="oauth-setup">
 OAuth setup
 &lt;a class="anchor" href="#oauth-setup">#&lt;/a>
&lt;/h1>
&lt;p>One-time OAuth for email sending.&lt;/p>
&lt;h2 id="gmail">
 Gmail
 &lt;a class="anchor" href="#gmail">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Set in .env first:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># GOOGLE_CLIENT_ID=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># GOOGLE_CLIENT_SECRET=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven auth-gmail
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Saves &lt;code>GMAIL_REFRESH_TOKEN&lt;/code> to &lt;code>.env&lt;/code>.&lt;/p>
&lt;h2 id="outlook">
 Outlook
 &lt;a class="anchor" href="#outlook">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Set in .env first:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># MS_CLIENT_ID=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># MS_CLIENT_SECRET=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven auth-outlook
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Saves refresh token to &lt;code>.env&lt;/code>.&lt;/p>
&lt;h2 id="send">
 Send
 &lt;a class="anchor" href="#send">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>raven send --provider gmail --input drafts/outreach.csv --dry-run
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven send --provider outlook --input drafts/outreach.csv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>See &lt;a href="../configuration/env/">Environment variables&lt;/a> for all &lt;code>.env&lt;/code> keys.&lt;/p></description></item></channel></rss>