<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Raven</title><link>https://raven.nopejs.me/</link><description>Recent content on Raven</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://raven.nopejs.me/index.xml" rel="self" type="application/rss+xml"/><item><title>How discovery works</title><link>https://raven.nopejs.me/docs/job-discovery/how-it-works/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/job-discovery/how-it-works/</guid><description>&lt;h1 id="how-job-discovery-works">
 How job discovery works
 &lt;a class="anchor" href="#how-job-discovery-works">#&lt;/a>
&lt;/h1>
&lt;p>Deep dive: architecture, data flow, and what Raven does &lt;strong>not&lt;/strong> do.&lt;/p>
&lt;p>&lt;strong>Module:&lt;/strong> &lt;code>jobs/discover.mjs&lt;/code> · &lt;strong>CLI:&lt;/strong> &lt;code>raven discover&lt;/code>&lt;/p>
&lt;hr>
&lt;h2 id="tldr">
 TL;DR
 &lt;a class="anchor" href="#tldr">#&lt;/a>
&lt;/h2>
&lt;p>&lt;code>raven discover&lt;/code> does &lt;strong>not&lt;/strong> search Google or scrape arbitrary websites. It runs up to four &lt;strong>parallel tiers&lt;/strong> that pull structured job data from public APIs and feeds, filters client-side, deduplicates by canonical apply URL, and saves to &lt;code>data/jobs.json&lt;/code>.&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-mermaid" data-lang="mermaid">flowchart LR
 A[raven discover] --&amp;gt; B[ATS APIs]
 A --&amp;gt; C[Board feeds]
 A --&amp;gt; D[Local SQLite]
 A --&amp;gt; E[hiring.cafe optional]
 B --&amp;gt; F[merge + dedup]
 C --&amp;gt; F
 D --&amp;gt; F
 E --&amp;gt; F
 F --&amp;gt; G[data/jobs.json]
&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 id="what-search-means">
 What &amp;ldquo;search&amp;rdquo; means
 &lt;a class="anchor" href="#what-search-means">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Mechanism&lt;/th>
 &lt;th>How listings are found&lt;/th>
 &lt;th>Default discover?&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>ATS reverse scan&lt;/td>
 &lt;td>Public JSON API per company board&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Board feeds&lt;/td>
 &lt;td>Aggregator APIs (RemoteOK, Remotive, …)&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>openjobdata index&lt;/td>
 &lt;td>SQL on &lt;code>data/jobs.db&lt;/code>&lt;/td>
 &lt;td>Yes (needs sync)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>hiring.cafe&lt;/td>
 &lt;td>POST search API&lt;/td>
 &lt;td>Opt-in&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>WebSearch / &lt;code>search_queries&lt;/code>&lt;/td>
 &lt;td>Google-style &lt;code>site:&lt;/code> queries&lt;/td>
 &lt;td>&lt;strong>Not implemented&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>scan_method: websearch&lt;/code>&lt;/td>
 &lt;td>Per-company handoff&lt;/td>
 &lt;td>&lt;strong>Log only&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Zero LLM, zero browser by default.&lt;/p></description></item><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>Architecture</title><link>https://raven.nopejs.me/docs/concepts/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/concepts/architecture/</guid><description>&lt;h1 id="architecture">
 Architecture
 &lt;a class="anchor" href="#architecture">#&lt;/a>
&lt;/h1>
&lt;p>Raven is a &lt;strong>bash CLI&lt;/strong> (&lt;code>bin/raven&lt;/code>) that dispatches to &lt;strong>shell scripts&lt;/strong> (&lt;code>scripts/*.sh&lt;/code>), which invoke a &lt;strong>Node.js discovery engine&lt;/strong> (&lt;code>jobs/&lt;/code>).&lt;/p>
&lt;pre tabindex="0">&lt;code>┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ bin/raven │────▶│ scripts/*.sh │────▶│ jobs/*.mjs │
│ (CLI) │ │ (_lib.sh) │ │ (ESM engine) │
└─────────────┘ └──────────────┘ └─────────────────┘
 │ │
 ▼ ▼
 config/*.yml data/jobs.json
 .env data/jobs.db
 files/resume.md drafts/
&lt;/code>&lt;/pre>&lt;h2 id="layers">
 Layers
 &lt;a class="anchor" href="#layers">#&lt;/a>
&lt;/h2>
&lt;h3 id="cli-layer-binraven-scripts">
 CLI layer (&lt;code>bin/raven&lt;/code>, &lt;code>scripts/&lt;/code>)
 &lt;a class="anchor" href="#cli-layer-binraven-scripts">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>Resolves repo root (works with &lt;code>npm link&lt;/code>)&lt;/li>
&lt;li>Loads &lt;code>.env&lt;/code>&lt;/li>
&lt;li>Ensures dependencies installed&lt;/li>
&lt;li>Forwards to Node scripts or bash helpers&lt;/li>
&lt;/ul>
&lt;h3 id="discovery-engine-jobs">
 Discovery engine (&lt;code>jobs/&lt;/code>)
 &lt;a class="anchor" href="#discovery-engine-jobs">#&lt;/a>
&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Module&lt;/th>
 &lt;th>Role&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>discover.mjs&lt;/code>&lt;/td>
 &lt;td>Orchestrates parallel tier scans&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>scan-ats-full.mjs&lt;/code>&lt;/td>
 &lt;td>Reverse ATS walk (12 platforms)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>scan.mjs&lt;/code>&lt;/td>
 &lt;td>Board feeds + portal scanner&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>sync-openjobdata.mjs&lt;/code>&lt;/td>
 &lt;td>HuggingFace → SQLite index&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>query-index.mjs&lt;/code>&lt;/td>
 &lt;td>Search local index&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>draft-outreach.mjs&lt;/code>&lt;/td>
 &lt;td>Application draft CLI&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>lib/draft-engine.mjs&lt;/code>&lt;/td>
 &lt;td>Profile + resume + form guides&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>plugins/gemini-draft.mjs&lt;/code>&lt;/td>
 &lt;td>Optional Gemini email polish&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="providers-jobsproviders">
 Providers (&lt;code>jobs/providers/&lt;/code>)
 &lt;a class="anchor" href="#providers-jobsproviders">#&lt;/a>
&lt;/h3>
&lt;p>One module per ATS or board feed. Each exports &lt;code>{ id, fetch, detect? }&lt;/code> and uses shared HTTP helpers.&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>Installation</title><link>https://raven.nopejs.me/docs/getting-started/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/getting-started/installation/</guid><description>&lt;h1 id="installation">
 Installation
 &lt;a class="anchor" href="#installation">#&lt;/a>
&lt;/h1>
&lt;h2 id="requirements">
 Requirements
 &lt;a class="anchor" href="#requirements">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Requirement&lt;/th>
 &lt;th>Version&lt;/th>
 &lt;th>Notes&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Node.js&lt;/td>
 &lt;td>18+&lt;/td>
 &lt;td>Required&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>npm&lt;/td>
 &lt;td>bundled with Node&lt;/td>
 &lt;td>Required&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Git&lt;/td>
 &lt;td>any&lt;/td>
 &lt;td>Clone the repository&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Optional:&lt;/p>
&lt;ul>
&lt;li>Gmail or Microsoft OAuth credentials for &lt;code>raven send&lt;/code>&lt;/li>
&lt;li>&lt;code>GEMINI_API_KEY&lt;/code> for &lt;code>raven draft --gemini&lt;/code>&lt;/li>
&lt;li>&lt;code>HF_TOKEN&lt;/code> (HuggingFace) if openjobdata sync returns HTTP 401&lt;/li>
&lt;/ul>
&lt;h2 id="clone-and-setup">
 Clone and setup
 &lt;a class="anchor" href="#clone-and-setup">#&lt;/a>
&lt;/h2>
&lt;p>From the Raven repository root:&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>git clone &amp;lt;your-raven-repo-url&amp;gt; raven
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd raven
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>./raven setup
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>raven setup&lt;/code> runs:&lt;/p>
&lt;ol>
&lt;li>&lt;code>npm install&lt;/code> in the repo root&lt;/li>
&lt;li>&lt;code>npm install&lt;/code> in &lt;code>jobs/&lt;/code>&lt;/li>
&lt;li>Creates starter config from examples (if missing):&lt;/li>
&lt;/ol>
&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>.env&lt;/code>&lt;/td>
 &lt;td>Sender identity, API keys, OAuth tokens&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>config/portals.yml&lt;/code>&lt;/td>
 &lt;td>Job search filters&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>config/profile.yml&lt;/code>&lt;/td>
 &lt;td>Identity, links, resume path&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>files/resume.md&lt;/code>&lt;/td>
 &lt;td>Starter resume (replace with yours)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="install-raven-globally-optional">
 Install &lt;code>raven&lt;/code> globally (optional)
 &lt;a class="anchor" href="#install-raven-globally-optional">#&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>npm link
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven --help
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Without &lt;code>npm link&lt;/code>, use &lt;code>./raven&lt;/code> from the repo root.&lt;/p></description></item><item><title>Logging</title><link>https://raven.nopejs.me/docs/reference/logging/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/reference/logging/</guid><description>&lt;h1 id="logging">
 Logging
 &lt;a class="anchor" href="#logging">#&lt;/a>
&lt;/h1>
&lt;p>All Raven job commands emit live progress and write timestamped log files.&lt;/p>
&lt;h2 id="default-behavior">
 Default behavior
 &lt;a class="anchor" href="#default-behavior">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Progress phases printed to stdout&lt;/li>
&lt;li>Summary line with counts and elapsed time&lt;/li>
&lt;li>Log file written to &lt;code>data/logs/&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Example log paths:&lt;/p>
&lt;pre tabindex="0">&lt;code>data/logs/discover-2026-07-04T08-30-00.log
data/logs/draft-2026-07-04T08-35-12.log
data/logs/sync-jobs-2026-07-04T07-00-00.log
data/logs/send-2026-07-04T09-00-00.log
&lt;/code>&lt;/pre>&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>Effect&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;em>(default)&lt;/em>&lt;/td>
 &lt;td>Live progress + log file&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--verbose&lt;/code>&lt;/td>
 &lt;td>Extra detail (per-ATS logs during discover)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--quiet&lt;/code>&lt;/td>
 &lt;td>One-line summary only&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--no-log&lt;/code>&lt;/td>
 &lt;td>Disable log file (stdout only)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="commands-with-logging">
 Commands with logging
 &lt;a class="anchor" href="#commands-with-logging">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;code>raven discover&lt;/code>&lt;/li>
&lt;li>&lt;code>raven draft&lt;/code>&lt;/li>
&lt;li>&lt;code>raven sync-jobs&lt;/code>&lt;/li>
&lt;li>&lt;code>raven scan-ats&lt;/code> / &lt;code>scan-boards&lt;/code>&lt;/li>
&lt;li>&lt;code>raven query&lt;/code>&lt;/li>
&lt;li>&lt;code>raven send&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="log-contents">
 Log contents
 &lt;a class="anchor" href="#log-contents">#&lt;/a>
&lt;/h2>
&lt;p>Typical discover log:&lt;/p></description></item><item><title>portals.yml</title><link>https://raven.nopejs.me/docs/configuration/portals/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/configuration/portals/</guid><description>&lt;h1 id="portalsyml">
 portals.yml
 &lt;a class="anchor" href="#portalsyml">#&lt;/a>
&lt;/h1>
&lt;p>&lt;code>config/portals.yml&lt;/code> controls &lt;strong>what jobs Raven considers relevant&lt;/strong> when you run &lt;code>raven discover&lt;/code> without explicit &lt;code>--q&lt;/code> / &lt;code>--loc&lt;/code> flags.&lt;/p>
&lt;h2 id="how-discover-uses-it">
 How discover uses it
 &lt;a class="anchor" href="#how-discover-uses-it">#&lt;/a>
&lt;/h2>
&lt;p>When you run bare &lt;code>raven discover&lt;/code>:&lt;/p>
&lt;ol>
&lt;li>Raven loads &lt;code>config/portals.yml&lt;/code> (or path from &lt;code>RAVEN_PORTALS&lt;/code> in &lt;code>.env&lt;/code>)&lt;/li>
&lt;li>Title keywords from &lt;code>title_filter.positive&lt;/code> become &lt;code>--q&lt;/code> filters&lt;/li>
&lt;li>Negative keywords become &lt;code>--not&lt;/code> filters&lt;/li>
&lt;li>Location rules from &lt;code>location_filter&lt;/code> become &lt;code>--loc&lt;/code> / &lt;code>--noloc&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>CLI flags &lt;strong>override&lt;/strong> portals config when provided:&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"># Uses portals.yml filters&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven discover
&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:#75715e"># Ignores portals title filter — uses CLI only&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
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="minimal-example">
 Minimal example
 &lt;a class="anchor" href="#minimal-example">#&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-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">title_filter&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">positive&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;software engineer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;backend&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;developer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;intern&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">negative&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;nurse&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;sales&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;Junior&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">location_filter&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">allow&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&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:#e6db74">&amp;#34;India&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">block&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;On-site only&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="title-filter-semantics">
 Title filter semantics
 &lt;a class="anchor" href="#title-filter-semantics">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>At least &lt;strong>one&lt;/strong> positive keyword must match the job title (case-insensitive substring)&lt;/li>
&lt;li>&lt;strong>Zero&lt;/strong> negative keywords may match&lt;/li>
&lt;li>Empty &lt;code>positive&lt;/code> list = match all titles (use negatives to exclude)&lt;/li>
&lt;/ul>
&lt;h3 id="location-filter-semantics">
 Location filter semantics
 &lt;a class="anchor" href="#location-filter-semantics">#&lt;/a>
&lt;/h3>
&lt;p>Applied in order:&lt;/p></description></item><item><title>Resume parsing</title><link>https://raven.nopejs.me/docs/drafting/resume/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/drafting/resume/</guid><description>&lt;h1 id="resume-parsing">
 Resume parsing
 &lt;a class="anchor" href="#resume-parsing">#&lt;/a>
&lt;/h1>
&lt;p>Raven parses your resume from &lt;code>config/profile.yml&lt;/code> → &lt;code>resume.path&lt;/code> and caches structured bullets and skills.&lt;/p>
&lt;h2 id="supported-formats">
 Supported formats
 &lt;a class="anchor" href="#supported-formats">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Format&lt;/th>
 &lt;th>Notes&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>.md&lt;/code>&lt;/td>
 &lt;td>&lt;strong>Best&lt;/strong> — use &lt;code>## Experience&lt;/code> with &lt;code>-&lt;/code> bullet lines&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>.txt&lt;/code>&lt;/td>
 &lt;td>Bullet lines + optional &lt;code>Skills:&lt;/code> line&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>.pdf&lt;/code>&lt;/td>
 &lt;td>Requires &lt;code>pdf-parse&lt;/code> (installed via &lt;code>raven setup&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="markdown-structure">
 Markdown structure
 &lt;a class="anchor" href="#markdown-structure">#&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-markdown" data-lang="markdown">&lt;span style="display:flex;">&lt;span># Your Name
&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:#75715e">## Experience
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">### Company A — Role Title
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">-&lt;/span> Built X using Y, achieving Z
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">-&lt;/span> Led migration of ...
&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:#75715e">### Company B — Role Title
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">-&lt;/span> Shipped feature that ...
&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:#75715e">## Skills
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>JavaScript, TypeScript, Node.js, React, PostgreSQL
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="parsing-rules">
 Parsing rules
 &lt;a class="anchor" href="#parsing-rules">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>Sections detected by &lt;code>## Heading&lt;/code> (H2)&lt;/li>
&lt;li>Bullets under &lt;code>## Experience&lt;/code> (including &lt;code>###&lt;/code> subheadings) are extracted&lt;/li>
&lt;li>Skills from &lt;code>## Skills&lt;/code> section or comma-separated line&lt;/li>
&lt;li>&lt;code>highlights&lt;/code> and &lt;code>skills&lt;/code> in &lt;code>profile.yml&lt;/code> override parser output when set&lt;/li>
&lt;/ul>
&lt;h2 id="cache">
 Cache
 &lt;a class="anchor" href="#cache">#&lt;/a>
&lt;/h2>
&lt;p>Parsed output is cached at &lt;code>data/cache/resume-parsed.json&lt;/code> for speed.&lt;/p></description></item><item><title>Sources &amp; tiers</title><link>https://raven.nopejs.me/docs/job-discovery/sources/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/job-discovery/sources/</guid><description>&lt;h1 id="job-sources">
 Job sources
 &lt;a class="anchor" href="#job-sources">#&lt;/a>
&lt;/h1>
&lt;p>Raven orchestrates discovery tiers in parallel via &lt;code>jobs/discover.mjs&lt;/code>. Each tier uses &lt;strong>public APIs or feeds&lt;/strong> — not web search engines.&lt;/p>
&lt;blockquote>
&lt;p>Full architecture: &lt;a href="how-it-works/">How discovery works&lt;/a> · WebSearch status: &lt;a href="scan-strategies/">Scan strategies&lt;/a>&lt;/p>&lt;/blockquote>
&lt;h2 id="tier-1--live-ats-apis---sources-ats">
 Tier 1 — Live ATS APIs (&lt;code>--sources ats&lt;/code>)
 &lt;a class="anchor" href="#tier-1--live-ats-apis---sources-ats">#&lt;/a>
&lt;/h2>
&lt;p>Reverse-scans public company directories and hits each platform&amp;rsquo;s zero-auth JSON API.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Platform&lt;/th>
 &lt;th>Careers URL pattern&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Greenhouse&lt;/td>
 &lt;td>&lt;code>job-boards.greenhouse.io/{slug}&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Lever&lt;/td>
 &lt;td>&lt;code>jobs.lever.co/{slug}&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Ashby&lt;/td>
 &lt;td>&lt;code>jobs.ashbyhq.com/{slug}&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Workday&lt;/td>
 &lt;td>&lt;code>{tenant}.wd{N}.myworkdayjobs.com/{site}&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Rippling&lt;/td>
 &lt;td>&lt;code>ats.rippling.com/{slug}/jobs&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Workable&lt;/td>
 &lt;td>&lt;code>apply.workable.com/{slug}&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>BambooHR&lt;/td>
 &lt;td>&lt;code>{tenant}.bamboohr.com/careers&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>SmartRecruiters&lt;/td>
 &lt;td>&lt;code>careers.smartrecruiters.com/{slug}&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Recruitee&lt;/td>
 &lt;td>&lt;code>{slug}.recruitee.com&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Pinpoint&lt;/td>
 &lt;td>&lt;code>{slug}.pinpointhq.com&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Teamtailor&lt;/td>
 &lt;td>&lt;code>{slug}.teamtailor.com&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Personio&lt;/td>
 &lt;td>&lt;code>{slug}.jobs.personio.de&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Company slug lists come from openjobdata (after &lt;code>raven sync-jobs&lt;/code>) or bundled caches in &lt;code>data/cache/ats-companies/&lt;/code>.&lt;/p></description></item><item><title>Workflow</title><link>https://raven.nopejs.me/docs/outreach/workflow/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/outreach/workflow/</guid><description>&lt;h1 id="outreach-workflow">
 Outreach workflow
 &lt;a class="anchor" href="#outreach-workflow">#&lt;/a>
&lt;/h1>
&lt;p>End-to-end flow from discovery to sent email.&lt;/p>
&lt;h2 id="1-discover">
 1. Discover
 &lt;a class="anchor" href="#1-discover">#&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 --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;/code>&lt;/pre>&lt;/div>&lt;p>Results save to &lt;code>data/jobs.json&lt;/code>.&lt;/p>
&lt;h2 id="2-draft">
 2. Draft
 &lt;a class="anchor" href="#2-draft">#&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;/code>&lt;/pre>&lt;/div>&lt;p>Creates:&lt;/p>
&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 with all columns&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;/tbody>
&lt;/table>
&lt;p>Optional: &lt;code>--xlsx&lt;/code> for Excel, &lt;code>--gemini&lt;/code> for AI polish.&lt;/p>
&lt;h2 id="3-review">
 3. Review
 &lt;a class="anchor" href="#3-review">#&lt;/a>
&lt;/h2>
&lt;p>Open the markdown file:&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>open drafts/outreach-*.md &lt;span style="color:#75715e"># macOS&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Check each entry:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>email&lt;/strong> rows — subject, body, disclaimer&lt;/li>
&lt;li>&lt;strong>form&lt;/strong> rows — follow &lt;code>form_steps&lt;/code> in browser (skip send)&lt;/li>
&lt;/ul>
&lt;p>Edit CSV directly if needed before sending.&lt;/p></description></item><item><title>Scan strategies</title><link>https://raven.nopejs.me/docs/job-discovery/scan-strategies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/job-discovery/scan-strategies/</guid><description>&lt;h1 id="scan-strategies">
 Scan strategies
 &lt;a class="anchor" href="#scan-strategies">#&lt;/a>
&lt;/h1>
&lt;p>&lt;code>portals.example.yml&lt;/code> documents a &lt;strong>4-level strategy&lt;/strong> for job discovery beyond default tiers. This page maps each level to what Raven runs automatically today.&lt;/p>
&lt;hr>
&lt;h2 id="four-levels-from-portalsexampleyml">
 Four levels (from portals.example.yml)
 &lt;a class="anchor" href="#four-levels-from-portalsexampleyml">#&lt;/a>
&lt;/h2>
&lt;pre tabindex="0">&lt;code>Level 0. local_parser → custom script per company
Level 1. Playwright → browser scrape of careers_url
Level 2. HTTP JSON → public ATS/board APIs (providers)
Level 3. WebSearch → site: filtered search queries
&lt;/code>&lt;/pre>&lt;p>&lt;strong>Default &lt;code>raven discover&lt;/code>&lt;/strong> uses HTTP JSON at scale (ATS reverse scan + board feeds) — not levels 0–1 per company, and &lt;strong>not level 3&lt;/strong>.&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>File layout</title><link>https://raven.nopejs.me/docs/reference/file-layout/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/reference/file-layout/</guid><description>&lt;h1 id="repository-layout">
 Repository layout
 &lt;a class="anchor" href="#repository-layout">#&lt;/a>
&lt;/h1>
&lt;pre tabindex="0">&lt;code>raven/
├── bin/raven # CLI entry (npm link → global raven)
├── raven # Symlink to bin/raven
├── scripts/ # Bash wrappers (_lib.sh, discover.sh, draft.sh, …)
├── jobs/ # Node.js job engine
│ ├── discover.mjs # Unified discovery orchestrator
│ ├── draft-outreach.mjs # Draft orchestrator
│ ├── lib/ # Shared modules (profile, resume, log, portals, …)
│ └── plugins/ # Optional plugins (gemini-draft.mjs)
├── config/
│ ├── portals.example.yml
│ ├── profile.example.yml
│ └── outreach.example.yml
├── files/
│ └── resume.example.md # Template resume
├── data/ # Gitignored runtime data
│ ├── jobs.json # Latest discover results
│ ├── jobs.db # openjobdata SQLite index
│ ├── cache/ # Resume parse cache, ATS slug lists
│ └── logs/ # Command logs
├── drafts/ # Generated outreach CSV/MD/XLSX
├── docs/ # Markdown docs (source for this site)
└── raven-web-docs/ # Hugo documentation site
&lt;/code>&lt;/pre>&lt;h2 id="tracked-vs-gitignored">
 Tracked vs gitignored
 &lt;a class="anchor" href="#tracked-vs-gitignored">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Tracked (committed)&lt;/th>
 &lt;th>Gitignored (local)&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>*.example.yml&lt;/code>&lt;/td>
 &lt;td>&lt;code>config/profile.yml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>files/resume.example.md&lt;/code>&lt;/td>
 &lt;td>&lt;code>config/portals.yml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Source code&lt;/td>
 &lt;td>&lt;code>config/outreach.yml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;/td>
 &lt;td>&lt;code>files/resume.md&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;/td>
 &lt;td>&lt;code>data/*.json&lt;/code>, &lt;code>data/jobs.db&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;/td>
 &lt;td>&lt;code>data/logs/&lt;/code>, &lt;code>data/cache/&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;/td>
 &lt;td>&lt;code>drafts/outreach-*&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;/td>
 &lt;td>&lt;code>.env&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="key-data-files">
 Key data files
 &lt;a class="anchor" href="#key-data-files">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Path&lt;/th>
 &lt;th>Created by&lt;/th>
 &lt;th>Purpose&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>data/jobs.json&lt;/code>&lt;/td>
 &lt;td>&lt;code>raven discover&lt;/code>&lt;/td>
 &lt;td>Latest job matches (default draft input)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>data/jobs.db&lt;/code>&lt;/td>
 &lt;td>&lt;code>raven sync-jobs&lt;/code>&lt;/td>
 &lt;td>Local openjobdata index&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>data/cache/resume-parsed.json&lt;/code>&lt;/td>
 &lt;td>&lt;code>raven draft&lt;/code>&lt;/td>
 &lt;td>Parsed resume cache&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>drafts/outreach-*.csv&lt;/code>&lt;/td>
 &lt;td>&lt;code>raven draft&lt;/code>&lt;/td>
 &lt;td>Send-ready spreadsheet&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="npm-scripts">
 npm scripts
 &lt;a class="anchor" href="#npm-scripts">#&lt;/a>
&lt;/h2>
&lt;p>Equivalent to &lt;code>./raven&lt;/code> subcommands:&lt;/p></description></item><item><title>Filters</title><link>https://raven.nopejs.me/docs/job-discovery/filters/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/job-discovery/filters/</guid><description>&lt;h1 id="discovery-filters">
 Discovery filters
 &lt;a class="anchor" href="#discovery-filters">#&lt;/a>
&lt;/h1>
&lt;p>Filters apply during &lt;code>raven discover&lt;/code>, &lt;code>raven scan-ats&lt;/code>, &lt;code>raven scan-boards&lt;/code>, and &lt;code>raven query&lt;/code>.&lt;/p>
&lt;h2 id="cli-flags">
 CLI flags
 &lt;a class="anchor" href="#cli-flags">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Flag&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Example&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>&lt;code>--q &amp;quot;backend, engineer&amp;quot;&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>&lt;code>--not &amp;quot;nurse, sales&amp;quot;&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>&lt;code>--loc Remote,India&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--noloc &amp;quot;On-site&amp;quot;&lt;/code>&lt;/td>
 &lt;td>Location block-list&lt;/td>
 &lt;td>&lt;code>--noloc &amp;quot;San Francisco&amp;quot;&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--since N&lt;/code>&lt;/td>
 &lt;td>Posted within last N days&lt;/td>
 &lt;td>&lt;code>--since 7&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--ats greenhouse,lever&lt;/code>&lt;/td>
 &lt;td>Limit ATS platforms&lt;/td>
 &lt;td>&lt;code>--ats ashby,workday&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--max N&lt;/code>&lt;/td>
 &lt;td>Cap total results&lt;/td>
 &lt;td>&lt;code>--max 100&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--limit N&lt;/code>&lt;/td>
 &lt;td>Per-provider limit&lt;/td>
 &lt;td>&lt;code>--limit 50&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="config-vs-cli">
 Config vs CLI
 &lt;a class="anchor" href="#config-vs-cli">#&lt;/a>
&lt;/h2>
&lt;p>When CLI flags are omitted, Raven merges filters from &lt;code>config/portals.yml&lt;/code>:&lt;/p></description></item><item><title>JD tailoring</title><link>https://raven.nopejs.me/docs/drafting/tailoring/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/drafting/tailoring/</guid><description>&lt;h1 id="job-description-tailoring">
 Job description tailoring
 &lt;a class="anchor" href="#job-description-tailoring">#&lt;/a>
&lt;/h1>
&lt;p>For each job, Raven extracts keywords from the title and matches your resume bullets to produce tailored application content.&lt;/p>
&lt;h2 id="output-columns">
 Output columns
 &lt;a class="anchor" href="#output-columns">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Column&lt;/th>
 &lt;th>Meaning&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>jd_keywords&lt;/code>&lt;/td>
 &lt;td>Terms extracted from job title (e.g. &lt;code>backend&lt;/code>, &lt;code>python&lt;/code>, &lt;code>remote&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>action_words&lt;/code>&lt;/td>
 &lt;td>Suggested verbs for this role type&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>tailored_bullets&lt;/code>&lt;/td>
 &lt;td>Top resume bullets ranked by relevance to the JD&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="how-matching-works">
 How matching works
 &lt;a class="anchor" href="#how-matching-works">#&lt;/a>
&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>Keyword extraction&lt;/strong> — splits title on common separators, filters stop words&lt;/li>
&lt;li>&lt;strong>Bullet scoring&lt;/strong> — each resume bullet scored by keyword overlap with title&lt;/li>
&lt;li>&lt;strong>Action words&lt;/strong> — role-type heuristics (backend → &amp;ldquo;architected&amp;rdquo;, &amp;ldquo;scaled&amp;rdquo;; ML → &amp;ldquo;trained&amp;rdquo;, &amp;ldquo;deployed&amp;rdquo;)&lt;/li>
&lt;li>&lt;strong>Top N&lt;/strong> — &lt;code>resume.max_bullets&lt;/code> from profile (default 5)&lt;/li>
&lt;/ol>
&lt;h2 id="example">
 Example
 &lt;a class="anchor" href="#example">#&lt;/a>
&lt;/h2>
&lt;p>Job title: &lt;strong>Senior Backend Engineer — Node.js&lt;/strong>&lt;/p></description></item><item><title>Pipeline</title><link>https://raven.nopejs.me/docs/concepts/pipeline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/concepts/pipeline/</guid><description>&lt;h1 id="discover--draft--send">
 Discover → Draft → Send
 &lt;a class="anchor" href="#discover--draft--send">#&lt;/a>
&lt;/h1>
&lt;p>Raven&amp;rsquo;s workflow is three stages. Each stage produces artifacts the next stage consumes.&lt;/p>
&lt;h2 id="stage-1-discover">
 Stage 1: Discover
 &lt;a class="anchor" href="#stage-1-discover">#&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>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Input:&lt;/strong> &lt;code>config/portals.yml&lt;/code> filters (+ optional CLI flags)&lt;/p>
&lt;p>&lt;strong>Output:&lt;/strong> &lt;code>data/jobs.json&lt;/code> (auto-saved)&lt;/p>
&lt;p>&lt;strong>Sources (parallel):&lt;/strong>&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Tier&lt;/th>
 &lt;th>Flag&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>ATS&lt;/td>
 &lt;td>&lt;code>--sources ats&lt;/code>&lt;/td>
 &lt;td>Live APIs: Greenhouse, Lever, Ashby, Workday, …&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Boards&lt;/td>
 &lt;td>&lt;code>--sources boards&lt;/code>&lt;/td>
 &lt;td>RemoteOK, Remotive, Arbeitnow, Landing.jobs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Index&lt;/td>
 &lt;td>&lt;code>--sources index&lt;/code>&lt;/td>
 &lt;td>Local SQLite from openjobdata&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>hiring.cafe&lt;/td>
 &lt;td>&lt;code>--sources hiringcafe&lt;/code>&lt;/td>
 &lt;td>Opt-in; may need &lt;code>HIRING_CAFE_ENABLED=1&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="stage-2-draft">
 Stage 2: Draft
 &lt;a class="anchor" href="#stage-2-draft">#&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;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Input:&lt;/strong> &lt;code>data/jobs.json&lt;/code> + &lt;code>config/profile.yml&lt;/code> + parsed resume&lt;/p></description></item><item><title>profile.yml</title><link>https://raven.nopejs.me/docs/configuration/profile/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/configuration/profile/</guid><description>&lt;h1 id="profileyml">
 profile.yml
 &lt;a class="anchor" href="#profileyml">#&lt;/a>
&lt;/h1>
&lt;p>&lt;code>config/profile.yml&lt;/code> is the &lt;strong>source of truth&lt;/strong> for who you are when Raven drafts applications.&lt;/p>
&lt;h2 id="structure">
 Structure
 &lt;a class="anchor" href="#structure">#&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-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">identity&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Your Name&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">email&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;you@example.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">phone&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">location&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;City, Country&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">links&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">resume&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;files/resume.md&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">portfolio&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://yoursite.dev&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">github&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://github.com/yourhandle&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">linkedin&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://linkedin.com/in/yourhandle&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">x&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://x.com/yourhandle&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">highlights&lt;/span>: [] &lt;span style="color:#75715e"># optional manual overrides&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">skills&lt;/span>: [] &lt;span style="color:#75715e"># optional manual overrides&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">resume&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">path&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;files/resume.md&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">max_bullets&lt;/span>: &lt;span style="color:#ae81ff">5&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">draft&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">gemini&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">enabled&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">model&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;gemini-2.0-flash&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">disclaimer&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Review and edit this draft yourself before sending or submitting.&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">outreach&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">greeting_generic&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Hey team&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">subject&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Application: {{title}} at {{company}}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">body&lt;/span>: |&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> {{greeting}},
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> I&amp;#39;m writing about the {{title}} role at {{company}}.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> {{highlights}}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> Best,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> {{senderName}}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="template-variables">
 Template variables
 &lt;a class="anchor" href="#template-variables">#&lt;/a>
&lt;/h2>
&lt;p>Used in &lt;code>outreach.subject&lt;/code> and &lt;code>outreach.body&lt;/code>:&lt;/p></description></item><item><title>Quick Start</title><link>https://raven.nopejs.me/docs/getting-started/quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/getting-started/quickstart/</guid><description>&lt;h1 id="quick-start">
 Quick Start
 &lt;a class="anchor" href="#quick-start">#&lt;/a>
&lt;/h1>
&lt;p>Five minutes from zero to your first tailored application drafts.&lt;/p>
&lt;h2 id="1-setup">
 1. Setup
 &lt;a class="anchor" href="#1-setup">#&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>cd raven
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>./raven setup
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="2-configure-filters-and-profile">
 2. Configure filters and profile
 &lt;a class="anchor" href="#2-configure-filters-and-profile">#&lt;/a>
&lt;/h2>
&lt;p>Edit &lt;strong>&lt;code>config/portals.yml&lt;/code>&lt;/strong> — what jobs to find:&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-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">title_filter&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">positive&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;software engineer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;backend&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;developer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">negative&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;nurse&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;sales&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">location_filter&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">allow&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&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:#e6db74">&amp;#34;India&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Edit &lt;strong>&lt;code>config/profile.yml&lt;/code>&lt;/strong> — who you are when drafting:&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-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">identity&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Your Name&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">email&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;you@example.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">location&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;City, Country&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">links&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">resume&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;files/resume.md&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">portfolio&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://yoursite.dev&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">github&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://github.com/you&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">linkedin&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://linkedin.com/in/you&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Replace &lt;strong>&lt;code>files/resume.md&lt;/code>&lt;/strong> with your real resume (Markdown with &lt;code>## Experience&lt;/code> and &lt;code>-&lt;/code> bullets works best).&lt;/p></description></item><item><title>ATS form guides</title><link>https://raven.nopejs.me/docs/drafting/form-guides/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/drafting/form-guides/</guid><description>&lt;h1 id="ats-form-guides">
 ATS form guides
 &lt;a class="anchor" href="#ats-form-guides">#&lt;/a>
&lt;/h1>
&lt;p>When a job&amp;rsquo;s apply URL points to an ATS (Greenhouse, Lever, Ashby, Workday, etc.), Raven generates a &lt;strong>form application guide&lt;/strong> instead of an email.&lt;/p>
&lt;h2 id="application-types">
 Application types
 &lt;a class="anchor" href="#application-types">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Type&lt;/th>
 &lt;th>Detected when&lt;/th>
 &lt;th>Raven output&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>email&lt;/code>&lt;/td>
 &lt;td>Direct email outreach possible&lt;/td>
 &lt;td>Subject + body&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>form&lt;/code>&lt;/td>
 &lt;td>Apply URL on known ATS domain&lt;/td>
 &lt;td>Step-by-step &lt;code>form_steps&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Form rows are &lt;strong>not&lt;/strong> sent via &lt;code>raven send&lt;/code>. Open the markdown review or CSV &lt;code>form_steps&lt;/code> column and follow the guide in your browser.&lt;/p></description></item><item><title>Environment variables</title><link>https://raven.nopejs.me/docs/configuration/env/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/configuration/env/</guid><description>&lt;h1 id="env-reference">
 .env reference
 &lt;a class="anchor" href="#env-reference">#&lt;/a>
&lt;/h1>
&lt;p>Copy from &lt;code>.env.example&lt;/code> on &lt;code>raven setup&lt;/code>. Secrets stay local — never commit &lt;code>.env&lt;/code>.&lt;/p>
&lt;h2 id="sender-identity">
 Sender identity
 &lt;a class="anchor" href="#sender-identity">#&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>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;/code>&lt;/pre>&lt;/div>&lt;p>Used by &lt;code>raven send&lt;/code> and draft disclaimers.&lt;/p>
&lt;h2 id="gmail-oauth">
 Gmail OAuth
 &lt;a class="anchor" href="#gmail-oauth">#&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>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 style="color:#75715e"># populated by raven auth-gmail&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Create OAuth credentials in &lt;a href="https://console.cloud.google.com/">Google Cloud Console&lt;/a> with Gmail send scope.&lt;/p>
&lt;h2 id="outlook-oauth">
 Outlook OAuth
 &lt;a class="anchor" href="#outlook-oauth">#&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>MS_CLIENT_ID&lt;span style="color:#f92672">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>MS_CLIENT_SECRET&lt;span style="color:#f92672">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>MS_REFRESH_TOKEN&lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#75715e"># populated by raven auth-outlook&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Register an app in &lt;a href="https://portal.azure.com/">Azure Portal&lt;/a> with Mail.Send permission.&lt;/p></description></item><item><title>Example Dry Run</title><link>https://raven.nopejs.me/docs/getting-started/dry-run/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/getting-started/dry-run/</guid><description>&lt;h1 id="example-dry-run">
 Example Dry Run
 &lt;a class="anchor" href="#example-dry-run">#&lt;/a>
&lt;/h1>
&lt;p>Complete pipeline walkthrough &lt;strong>without sending email&lt;/strong>. Copy commands from your Raven repo root.&lt;/p>
&lt;h2 id="step-0--install">
 Step 0 — Install
 &lt;a class="anchor" href="#step-0--install">#&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>cd raven
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>./raven setup
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="step-1--configure">
 Step 1 — Configure
 &lt;a class="anchor" href="#step-1--configure">#&lt;/a>
&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>&lt;code>config/profile.yml&lt;/code>&lt;/strong> — name, email, portfolio, GitHub, LinkedIn, resume path&lt;/li>
&lt;li>&lt;strong>&lt;code>files/resume.md&lt;/code>&lt;/strong> — your resume with &lt;code>-&lt;/code> bullets under &lt;code>## Experience&lt;/code>&lt;/li>
&lt;li>&lt;strong>&lt;code>config/portals.yml&lt;/code>&lt;/strong> — title keywords (e.g. &lt;code>software engineer&lt;/code>, &lt;code>backend&lt;/code>, &lt;code>developer&lt;/code>)&lt;/li>
&lt;/ol>
&lt;p>No Gmail OAuth needed for this dry run.&lt;/p></description></item><item><title>openjobdata</title><link>https://raven.nopejs.me/docs/job-discovery/openjobdata/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/job-discovery/openjobdata/</guid><description>&lt;h1 id="openjobdata-index">
 openjobdata index
 &lt;a class="anchor" href="#openjobdata-index">#&lt;/a>
&lt;/h1>
&lt;p>Raven syncs the &lt;a href="https://openjobdata.com/documentation">openjobdata&lt;/a> dataset into a local SQLite database for fast offline search.&lt;/p>
&lt;h2 id="sync">
 Sync
 &lt;a class="anchor" href="#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 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;h3 id="what-happens">
 What happens
 &lt;a class="anchor" href="#what-happens">#&lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>Downloads companies registry from HuggingFace bucket &lt;code>Invicto69/Jobs-Dataset-bucket&lt;/code>&lt;/li>
&lt;li>Fetches 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;h3 id="authentication">
 Authentication
 &lt;a class="anchor" href="#authentication">#&lt;/a>
&lt;/h3>
&lt;p>If sync returns 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;p>Create a read token at &lt;a href="https://huggingface.co/settings/tokens">huggingface.co/settings/tokens&lt;/a>.&lt;/p>
&lt;h2 id="query-local-index">
 Query local index
 &lt;a class="anchor" href="#query-local-index">#&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 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;ML engineer&amp;#34;&lt;/span> --ats greenhouse,lever --json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Same filter flags 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>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>Troubleshooting</title><link>https://raven.nopejs.me/docs/reference/troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/reference/troubleshooting/</guid><description>&lt;h1 id="troubleshooting">
 Troubleshooting
 &lt;a class="anchor" href="#troubleshooting">#&lt;/a>
&lt;/h1>
&lt;p>Common issues and fixes.&lt;/p>
&lt;h2 id="raven-command-not-found">
 &lt;code>raven: command not found&lt;/code>
 &lt;a class="anchor" href="#raven-command-not-found">#&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"># From repo root&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>./raven --help
&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:#75715e"># Or install globally&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm link
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>raven --help
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If &lt;code>npm link&lt;/code> resolves to the wrong path, use &lt;code>./raven&lt;/code> from the repo root.&lt;/p>
&lt;h2 id="raven-draft--no-input-file">
 &lt;code>raven draft&lt;/code> — no input file
 &lt;a class="anchor" href="#raven-draft--no-input-file">#&lt;/a>
&lt;/h2>
&lt;p>Discover auto-saves to &lt;code>data/jobs.json&lt;/code>. Run discover first:&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 discover --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 draft --max &lt;span style="color:#ae81ff">25&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Or pass explicit input:&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 draft --input data/jobs.json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="unrelated-jobs-nurse-sales-etc">
 Unrelated jobs (nurse, sales, etc.)
 &lt;a class="anchor" href="#unrelated-jobs-nurse-sales-etc">#&lt;/a>
&lt;/h2>
&lt;p>Bare &lt;code>raven discover&lt;/code> reads &lt;code>config/portals.yml&lt;/code>. Fix filters:&lt;/p></description></item><item><title>Gemini plugin</title><link>https://raven.nopejs.me/docs/drafting/gemini/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://raven.nopejs.me/docs/drafting/gemini/</guid><description>&lt;h1 id="gemini-draft-plugin">
 Gemini draft plugin
 &lt;a class="anchor" href="#gemini-draft-plugin">#&lt;/a>
&lt;/h1>
&lt;p>Optional AI polish for &lt;strong>email&lt;/strong> drafts via Google&amp;rsquo;s Gemini API.&lt;/p>
&lt;h2 id="setup">
 Setup
 &lt;a class="anchor" href="#setup">#&lt;/a>
&lt;/h2>
&lt;ol>
&lt;li>Get an API key from &lt;a href="https://aistudio.google.com/apikey">Google AI Studio&lt;/a>&lt;/li>
&lt;li>Add to &lt;code>.env&lt;/code>:&lt;/li>
&lt;/ol>
&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>GEMINI_API_KEY&lt;span style="color:#f92672">=&lt;/span>your_key_here
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>Enable in profile (optional):&lt;/li>
&lt;/ol>
&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-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">draft&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">gemini&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">enabled&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">model&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;gemini-2.0-flash&amp;#34;&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 draft --input data/jobs.json --gemini --max &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Or one-shot discover + draft:&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 draft --q &lt;span style="color:#e6db74">&amp;#34;backend engineer&amp;#34;&lt;/span> --gemini --max &lt;span style="color:#ae81ff">5&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="what-gemini-does">
 What Gemini does
 &lt;a class="anchor" href="#what-gemini-does">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Rewrites email subject and body for clarity and tone&lt;/li>
&lt;li>Preserves factual content from your resume bullets&lt;/li>
&lt;li>Does &lt;strong>not&lt;/strong> fabricate experience — works from parsed resume + JD keywords&lt;/li>
&lt;/ul>
&lt;h2 id="what-gemini-does-not-do">
 What Gemini does not do
 &lt;a class="anchor" href="#what-gemini-does-not-do">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Form application guides (ATS rows stay template-based)&lt;/li>
&lt;li>Verify email addresses&lt;/li>
&lt;li>Auto-send — you must review and run &lt;code>raven send&lt;/code> yourself&lt;/li>
&lt;/ul>
&lt;h2 id="disclaimer">
 Disclaimer
 &lt;a class="anchor" href="#disclaimer">#&lt;/a>
&lt;/h2>
&lt;p>Every draft includes:&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>