<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dipendu Ray</title>
    <description>The latest articles on DEV Community by Dipendu Ray (@blezecon).</description>
    <link>https://dev.to/blezecon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4153713%2Fc69e86fa-2c97-4888-98b9-0ef67d252571.jpeg</url>
      <title>DEV Community: Dipendu Ray</title>
      <link>https://dev.to/blezecon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/blezecon"/>
    <language>en</language>
    <item>
      <title>Second Ring: A Local-First AI Front Desk for Solo Trades (Hacktoberfest Week 2)</title>
      <dc:creator>Dipendu Ray</dc:creator>
      <pubDate>Wed, 14 Oct 2026 14:50:53 +0000</pubDate>
      <link>https://dev.to/blezecon/second-ring-a-local-first-ai-front-desk-for-solo-trades-hacktoberfest-week-2-dc5</link>
      <guid>https://dev.to/blezecon/second-ring-a-local-first-ai-front-desk-for-solo-trades-hacktoberfest-week-2-dc5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge: Week 2&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Solo tradespeople—plumbers, electricians, mobile mechanics, tutors, and cleaners—lose business every single week for one simple reason: &lt;strong&gt;they miss inquiries while their hands are full on a job.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When someone has a burst pipe or a leaking tap, they text or DM. If they don't get a prompt response, they move down the list and hire someone else. But solo operators cannot answer calls or compose text messages while fixing a boiler or balancing on a ladder.&lt;/p&gt;

&lt;p&gt;Existing automated front desks and AI receptionists are built around metered, per-message proprietary APIs (like OpenAI or Retell) or complex hosted SaaS tools. For an independent contractor, this creates two non-starters:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Metered costs eat their margins&lt;/strong&gt; on high-volume, low-margin inquiries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer privacy is compromised&lt;/strong&gt;: job inquiries contain sensitive personal data—names, physical home addresses, access codes, and details about home vulnerabilities.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I built &lt;strong&gt;Second Ring (Side Hustle)&lt;/strong&gt;: a local-first, zero-dependency AI front desk that runs entirely in the terminal powered by &lt;strong&gt;open-weight models (Gemma 3:4B via Ollama)&lt;/strong&gt; and deterministic code guardrails.&lt;/p&gt;

&lt;p&gt;The local open-weight model extracts and classifies job requests. Pure deterministic code validates required fields, enforces strict safety boundaries (no prices quoted over SMS, no confirmed bookings without owner approval), and stages the job. The trade owner reviews, approves, or dismisses all jobs with simple slash commands right from their terminal.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Would Pay For It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Target Audience:&lt;/strong&gt; Solo service contractors and independent trades (plumbers, electricians, locksmiths, mobile detailers, barbers, private tutors).&lt;/p&gt;

&lt;h3&gt;
  
  
  Why They Would Pay:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Immediate ROI (Prevented Lost Leads):&lt;/strong&gt; A single plumbing job won from a fast, professional response easily pays $150–$500+. Missing 2–3 leads a month due to unanswered messages costs thousands of dollars a year.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Ongoing API Billing:&lt;/strong&gt; Unlike commercial SaaS receptionists charging $50–$100/month plus per-minute or per-token usage fees, Second Ring runs locally on their own laptop with $0 inference cost. A one-time purchase or modest setup fee ($49–$99) gives them an always-on front desk that never meters their messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uncompromised Customer Trust &amp;amp; Privacy:&lt;/strong&gt; Customers often share sensitive entry details (e.g. "key is under the mat at 14 Elm St"). Independent contractors with privacy-conscious clientele can guarantee client data never touches third-party cloud servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict Human-in-the-Loop Control:&lt;/strong&gt; Solo operators fear hallucinations: an AI promising a $50 quote for a complex job or booking a customer when the plumber is already booked solid. Second Ring guarantees that &lt;strong&gt;no booking is confirmed and no price is ever quoted&lt;/strong&gt; without human sign-off.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Here is a walkthrough of the terminal interaction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[caller] hi it's Sam at 3 Pine St, my kitchen drain is blocked, can you come Tuesday morning?

[owner] New job for Riverbend Plumbing
[owner] caller - blocked drains
[owner] Sam, 3 Pine St
[owner] Wants: Tuesday morning
[owner] Job #1 — /approve 1 to confirm.

&amp;lt;- Thanks, we've got your details and passed them to Sam. You'll hear back shortly to lock in a time.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The owner can inspect jobs or approve bookings with terminal commands:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/jobs
/approve 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;When approved, the confirmed message is printed for the caller:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-&amp;gt; [SMS to caller] Your booking for Tuesday morning is confirmed with Sam (Riverbend Plumbing). See you then!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Reproducing via Pipe / Quick Test:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the repository&lt;/span&gt;
git clone https://github.com/blezecon/idk.git side-hustle
&lt;span class="nb"&gt;cd &lt;/span&gt;side-hustle

&lt;span class="c"&gt;# Pull &amp;amp; run Gemma 3 local model&lt;/span&gt;
ollama pull gemma3:4b
ollama serve

&lt;span class="c"&gt;# Pipe sample conversation and commands:&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"my drain is blocked, Sam, 3 Pine St, Tuesday morning"&lt;/span&gt; &lt;span class="s2"&gt;"/jobs"&lt;/span&gt; &lt;span class="s2"&gt;"/approve 1"&lt;/span&gt; | npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/blezecon" rel="noopener noreferrer"&gt;
        blezecon
      &lt;/a&gt; / &lt;a href="https://github.com/blezecon/idk" rel="noopener noreferrer"&gt;
        idk
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Side Hustle — a local-first AI front desk&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Job triage for a one-person trade, running entirely in the terminal on &lt;strong&gt;open-weight
models you host yourself&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A plumber, barber or tutor misses a call while their hands are full, and the enquiry
arrives as a text, a DM or a form message. Paste it into the front desk and a &lt;strong&gt;local
open-weight model&lt;/strong&gt; works out what the job is and collects the few details the owner
actually needs. The owner reviews every job in the same terminal and approves it
Nothing is promised to a customer until a human says so.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Built for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge: Week 2 — Side Hustle&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why open models matter here&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The existing tools in this space glue a closed, per-message API (OpenAI, Retell) to the
front desk. That's a bad fit for a one-person business:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost.&lt;/strong&gt; A busy trade can send…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/blezecon/idk" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository&lt;/strong&gt;: &lt;a href="https://github.com/blezecon/idk" rel="noopener noreferrer"&gt;https://github.com/blezecon/idk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License&lt;/strong&gt;: MIT&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies&lt;/strong&gt;: Zero external npm packages (&lt;code&gt;package.json&lt;/code&gt; has 0 dependencies). Runs on native Node.js 22.5+ with built-in SQLite (&lt;code&gt;node:sqlite&lt;/code&gt;), built-in test runner (&lt;code&gt;node:test&lt;/code&gt;), and native &lt;code&gt;fetch&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Architecture Overview
&lt;/h3&gt;

&lt;p&gt;The system strictly decouples &lt;strong&gt;language extraction&lt;/strong&gt; from &lt;strong&gt;decision authority&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  C[Caller Message] --&amp;gt;|Input| A[Terminal Front Desk]
  A --&amp;gt;|Prompt + JSON Schema| M[(Ollama / Gemma 3 Local)]
  M --&amp;gt;|Structured JSON| V{Deterministic Guardrails}
  V --&amp;gt;|Missing required field| C
  V --&amp;gt;|Complete + Verified| DB[(SQLite Jobs DB)]
  DB --&amp;gt; O[Trade Owner CLI]
  O --&amp;gt;|/approve ID| C
  V --&amp;gt;|Spam / Emergency / Needs Human| O&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  1. Model Layer (&lt;code&gt;src/model.js&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Runs &lt;strong&gt;Gemma 3:4B&lt;/strong&gt; via Ollama's local HTTP API (&lt;code&gt;/api/chat&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Uses structured output schema (&lt;code&gt;format: SCHEMA&lt;/code&gt;) to force strict JSON containing:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;intent&lt;/code&gt;: &lt;code&gt;"quote" | "booking" | "question" | "emergency" | "spam" | "wrong_number" | "human"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;service&lt;/code&gt;, &lt;code&gt;urgency&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;address&lt;/code&gt;, &lt;code&gt;preferred_time&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;needs_human&lt;/code&gt;: boolean flag&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reply_text&lt;/code&gt;: single polite question asking for the next missing piece of info&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Includes automatic retry handling for model stability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Deterministic Guardrails (&lt;code&gt;src/triage.js&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;An LLM should never be trusted with money, calendar commitments, or safety policies. The deterministic layer enforces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Price Protection:&lt;/strong&gt; Regex inspection prevents any dollar, euro, pound, or hourly rate from ever reaching the customer. Quotes must be given on-site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No False Commitments:&lt;/strong&gt; Any phrasing resembling "you're booked" or "confirmed for" generated by a model is discarded. Only the owner can issue a confirmation via &lt;code&gt;/approve&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handoff Rules:&lt;/strong&gt; Any emergency, abusive interaction, or conversation exceeding the turn cap immediately transitions to &lt;code&gt;needs_human&lt;/code&gt; handoff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ordered Field Collection:&lt;/strong&gt; Checks required fields in order (&lt;code&gt;service&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;address&lt;/code&gt;, &lt;code&gt;preferred_time&lt;/code&gt;) so the customer is asked only one clear question at a time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Local Persistence (&lt;code&gt;src/db.js&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uses Node.js native &lt;code&gt;node:sqlite&lt;/code&gt; (DatabaseSync) with WAL mode enabled.&lt;/li&gt;
&lt;li&gt;Stores conversations, individual turns, and active jobs locally in &lt;code&gt;second-ring.db&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Open-source AI and open-weight models are the catalyst that makes this entire business viable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Marginal-Cost Inference:&lt;/strong&gt; Closed APIs charge per token. A single active trade handling hundreds of inquiries a month faces unpredictable operational bills. Open-weight models like &lt;strong&gt;Gemma&lt;/strong&gt; run locally with zero API expenses, turning an unpredictable operational liability into predictable software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;True Data Sovereignty &amp;amp; Privacy:&lt;/strong&gt; Job inquiries for home services inherently expose physical addresses, home vulnerabilities ("back door lock broken"), and schedules ("we are away until Friday"). Routing this information through third-party proprietary clouds creates unnecessary liability. Open-weight inference ensures data stays 100% on the owner's hardware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor Independence:&lt;/strong&gt; When building a tool for independent small businesses, relying on a closed provider leaves you vulnerable to sudden pricing changes, rate limits, or discontinued model checkpoints. Open-weight models allow you to lock in working weights and swap models (Gemma, Llama, Qwen) whenever you choose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline Capability:&lt;/strong&gt; Trades often operate in areas with poor cellular reception (basements, construction sites, rural properties). A local-first stack running on a laptop or local mini-server continues functioning without reliable cloud connectivity.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ for solo trades and small business owners during Hacktoberfest 2026 Week 2.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>gemma</category>
      <category>ai</category>
    </item>
    <item>
      <title>DevOrbit Grounded Resume &amp; Job Matching Built for Friends Seeking Work</title>
      <dc:creator>Dipendu Ray</dc:creator>
      <pubDate>Sat, 03 Oct 2026 15:16:12 +0000</pubDate>
      <link>https://dev.to/blezecon/devorbit-grounded-resume-job-matching-built-for-friends-seeking-work-2ka6</link>
      <guid>https://dev.to/blezecon/devorbit-grounded-resume-job-matching-built-for-friends-seeking-work-2ka6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Applying for jobs today feels like screaming into a void. You send a resume out, hear nothing back, and never find out whether you were rejected for a missing skill or because a recruiter simply moved on. Job listings are walls of buzzwords. Resumes are walls of bullet points. To make things worse, generic AI resume tools paper over this with an arbitrary number—&lt;em&gt;"72% match"&lt;/em&gt;—and then proceed to hallucinate skills or experience you don't even have.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;DevOrbit&lt;/strong&gt; for my friends who are actively seeking jobs. &lt;/p&gt;

&lt;p&gt;When you're searching for work, what you need isn't flattery or invented qualifications—it's &lt;strong&gt;honest clarity&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where does my background legitimately line up with this job listing?&lt;/li&gt;
&lt;li&gt;What requirements do I satisfy, what is partial, and what is genuinely missing?&lt;/li&gt;
&lt;li&gt;How can I highlight my real experience without making anything up?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DevOrbit&lt;/strong&gt; is a privacy-first, grounded job matching web app. It takes a candidate's PDF resume, extracts their profile using an open-weight model, searches across six real-time job boards simultaneously, and runs a &lt;strong&gt;deterministic matching engine in plain code&lt;/strong&gt; to produce an honest breakdown of where you stand. Every single recommendation is strictly grounded in what you actually wrote.&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Check out the project repository on GitHub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/blezecon/devorbit" rel="noopener noreferrer"&gt;https://github.com/blezecon/devorbit&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to Run Locally
&lt;/h3&gt;

&lt;p&gt;You can spin up DevOrbit in minutes with local inference via Ollama or via OpenRouter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clone &amp;amp; install&lt;/span&gt;
git clone https://github.com/blezecon/devorbit.git
&lt;span class="nb"&gt;cd &lt;/span&gt;devorbit
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="c"&gt;#pnpm i&lt;/span&gt;

&lt;span class="c"&gt;# 2. Setup environment&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env.local

&lt;span class="c"&gt;# Run completely local with Gemma (Ollama)&lt;/span&gt;
ollama pull gemma3:4b
ollama serve

&lt;span class="c"&gt;# You Can run this with llama cpp also&lt;/span&gt;
&lt;span class="c"&gt;# If you are facing problems with local models, then You can use openrouter api also&lt;/span&gt;

&lt;span class="c"&gt;# 3. Start DevOrbit&lt;/span&gt;
npm run dev &lt;span class="c"&gt;#pnpm dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Visit &lt;code&gt;http://localhost:3000&lt;/code&gt; to upload a resume and explore matched jobs.&lt;/p&gt;


&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/blezecon" rel="noopener noreferrer"&gt;
        blezecon
      &lt;/a&gt; / &lt;a href="https://github.com/blezecon/devorbit" rel="noopener noreferrer"&gt;
        devorbit
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Fully Vibe Coded 
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;DevOrbit&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Understand which jobs actually fit your resume.&lt;/p&gt;

&lt;p&gt;Built for the &lt;strong&gt;Hacktoberfest 2026 Weekend Challenge: Build for a Friend&lt;/strong&gt; — an MVP that helps one
real person compare their resume against real job listings, with an open-weight model doing the
reading.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Applying to jobs feels like guessing. You send a resume, hear nothing back, and never learn whether you
were rejected for a skill you lacked or because the recruiter moved on. Job descriptions are walls of
text. Your resume is a different wall of text. Nothing in either tells you where they line up.&lt;/p&gt;
&lt;p&gt;Generic AI resume tools paper over this with a single invented score — "72% match" — and then suggest
you add experience you do not have.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Solution&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;DevOrbit reads both documents with an open-weight model, puts them in the same structured
vocabulary, and then compares them with plain code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Matches&lt;/strong&gt; — requirements your resume…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/blezecon/devorbit" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The codebase is open source under the permissive &lt;strong&gt;MIT License&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend / Framework&lt;/strong&gt;: Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS v4.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Components&lt;/strong&gt;: &lt;a href="https://www.neobrutalism.dev" rel="noopener noreferrer"&gt;Neobrutalism UI&lt;/a&gt; built on Base UI / shadcn registry with Lucide icons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation&lt;/strong&gt;: Zod runtime schema validation on all inputs and model outputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF Extraction&lt;/strong&gt;: &lt;code&gt;unpdf&lt;/code&gt; for zero-disk, pure in-memory text parsing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Suite&lt;/strong&gt;: Vitest suite covering matching logic, job providers, and parsing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The core philosophy behind DevOrbit is &lt;strong&gt;separation of language extraction from evaluation logic&lt;/strong&gt;. Large language models are fantastic parsers, but notoriously unreliable judges if left unconstrained. &lt;/p&gt;

&lt;p&gt;DevOrbit implements a 5-stage pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    A["1. PDF Upload (In-memory via unpdf)"] --&amp;gt; B["2. Candidate Extraction (Gemma Open-Weight Model)"]
    C["Job Search (6 Free APIs: Himalayas, Jobicy, RemoteOK, Remotive, Arbeitnow, Ocean of Jobs)"] --&amp;gt; D["3. Requirements Extraction (Gemma Open-Weight Model)"]
    B --&amp;gt; E["4. Deterministic Matching Engine (Plain Code - Zero LLM Hallucinations)"]
    D --&amp;gt; E
    E --&amp;gt; F["5. Grounded Explanation &amp;amp; Suggestions (Gemma Model + strict evidenceRef)"]&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  The 5 Stages:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Extract&lt;/strong&gt;: The PDF is parsed directly in memory with &lt;code&gt;unpdf&lt;/code&gt; without writing any temp files to disk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Candidate Extraction&lt;/strong&gt;: An open-weight model parses messy resume text into structured &lt;code&gt;Candidate&lt;/code&gt; JSON (skills, experience, projects, education).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job Requirements Extraction&lt;/strong&gt;: When a job is selected from one of the 6 integrated job boards, the model extracts core requirements into structured &lt;code&gt;JobRequirements&lt;/code&gt; JSON.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Match (Plain Code)&lt;/strong&gt;: &lt;strong&gt;No model is involved here.&lt;/strong&gt; The matching is pure arithmetic and normalized token matching with an alias table. The same resume and job will always produce the identical fit score. A model cannot talk itself into an inflated percentage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grounded Explanation&lt;/strong&gt;: The model explains matches and highlights suggestions. Every single suggestion must quote an exact phrase (&lt;code&gt;evidenceRef&lt;/code&gt;) from your resume. If it references an ungrounded or invented detail, the suggestion is discarded in code.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Open-source AI is not an afterthought in DevOrbit—it is the foundational reason the product can be trusted:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Absolute Resume Privacy&lt;/strong&gt;: A resume contains deeply sensitive personal information—full legal names, employment timelines, educational history, and contact details. Sending this data to closed proprietary cloud APIs exposes job seekers to tracking, logging, and data harvesting. With open-weight models (running locally on Ollama or llama.cpp), the resume &lt;strong&gt;never leaves your machine&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Barrier to Entry (Zero API Cost)&lt;/strong&gt;: Job seekers are often on strict budgets. Running an open-weight 4B model locally costs nothing in API subscriptions or token billing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditability &amp;amp; Integrity&lt;/strong&gt;: Commercial ATS scanners hide their algorithms behind proprietary black boxes. With open-source models and transparent prompts versioned directly in code (&lt;code&gt;PROMPT_VERSION&lt;/code&gt;), every evaluation is fully auditable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilience&lt;/strong&gt;: The system supports standard OpenAI-compatible endpoints, allowing users to swap between local runtimes (Ollama, llama-server) or hosted gateways (OpenRouter) with zero code modifications.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ for friends on the job hunt during the Hacktoberfest 2026 Weekend Challenge.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
    </item>
  </channel>
</rss>
