<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Concepts on Raven</title><link>https://raven.nopejs.me/docs/concepts/</link><description>Recent content in Concepts on Raven</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://raven.nopejs.me/docs/concepts/index.xml" rel="self" type="application/rss+xml"/><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>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></channel></rss>