<?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: Nikhil Jangid</title>
    <description>The latest articles on DEV Community by Nikhil Jangid (@nikhiljangid343).</description>
    <link>https://dev.to/nikhiljangid343</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.png</url>
      <title>DEV Community: Nikhil Jangid</title>
      <link>https://dev.to/nikhiljangid343</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nikhiljangid343"/>
    <language>en</language>
    <item>
      <title>JobFit Local: Private, Open-Weight AI for My Next Job Application</title>
      <dc:creator>Nikhil Jangid</dc:creator>
      <pubDate>Sat, 03 Oct 2026 12:46:36 +0000</pubDate>
      <link>https://dev.to/nikhiljangid343/jobfit-local-private-open-weight-ai-for-my-next-job-application-4bp6</link>
      <guid>https://dev.to/nikhiljangid343/jobfit-local-private-open-weight-ai-for-my-next-job-application-4bp6</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;I built &lt;strong&gt;JobFit Local&lt;/strong&gt; for a very specific friend: &lt;strong&gt;future me&lt;/strong&gt;, the version of me opening the next job application and wondering whether a role is genuinely worth pursuing.&lt;/p&gt;

&lt;p&gt;That person has three problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;job descriptions are noisy and repetitive;&lt;/li&gt;
&lt;li&gt;tailoring every application takes time;&lt;/li&gt;
&lt;li&gt;a resume contains personal information that should not be sent to another API just to get a match score.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;JobFit Local compares a resume with a job description and returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a semantic fit score;&lt;/li&gt;
&lt;li&gt;skills already aligned with the role;&lt;/li&gt;
&lt;li&gt;named skills that need honest evidence;&lt;/li&gt;
&lt;li&gt;three practical next steps for tailoring the application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also explicitly warns users not to add skills they cannot defend. This is a decision aid, not a hiring system.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://nikhiljangid120.github.io/jobfit-local/" rel="noopener noreferrer"&gt;https://nikhiljangid120.github.io/jobfit-local/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The app includes a &lt;strong&gt;Try an example&lt;/strong&gt; button, so you can test the full flow without pasting personal information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1we7tzq1x4inoeuildfe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1we7tzq1x4inoeuildfe.png" alt="JobFit Local showing a 69/100 semantic match, aligned skills, skill gaps, and next steps" width="800" height="450"&gt;&lt;/a&gt;&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/nikhiljangid120" rel="noopener noreferrer"&gt;
        nikhiljangid120
      &lt;/a&gt; / &lt;a href="https://github.com/nikhiljangid120/jobfit-local" rel="noopener noreferrer"&gt;
        jobfit-local
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Privacy-first AI resume matcher powered by an open-weight model running in your browser — built for Hacktoberfest 2026.
    &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;JobFit Local&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A privacy-first AI resume matcher built for &lt;strong&gt;future Nikhil&lt;/strong&gt; during the Hacktoberfest 2026 “Build for a Friend” weekend challenge.&lt;/p&gt;
&lt;p&gt;Paste a resume and job description to get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a semantic fit score;&lt;/li&gt;
&lt;li&gt;explicit matched and missing skills;&lt;/li&gt;
&lt;li&gt;an honest, focused application plan.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why open AI&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Job hunting materials are personal. JobFit Local uses the Apache-2.0-licensed &lt;a href="https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2" rel="nofollow noopener noreferrer"&gt;&lt;code&gt;sentence-transformers/all-MiniLM-L6-v2&lt;/code&gt;&lt;/a&gt; model through open-source &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;Transformers.js&lt;/a&gt;. Inference runs in the browser. The app has no backend and does not upload resume or job-description text.&lt;/p&gt;
&lt;p&gt;The model is downloaded on first use and can then be reused from the browser cache. Open weights make the model inspectable and replaceable, avoid an API key, and let the app run without sending career data to a proprietary service.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run locally&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;python3 -m http.server 8000&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then open &lt;code&gt;http://localhost:8000&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tests&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm &lt;span class="pl-c1"&gt;test&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Responsible use&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The match score is directional, not a hiring decision. The app tells users never…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/nikhiljangid120/jobfit-local" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The project is MIT licensed and includes five tests for normalization, skill comparison, vector similarity, score blending, and recommendation safety.&lt;/p&gt;

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

&lt;p&gt;JobFit Local is a static HTML, CSS, and JavaScript application with no backend.&lt;/p&gt;

&lt;p&gt;At its core is the Apache-2.0-licensed &lt;a href="https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2" rel="noopener noreferrer"&gt;&lt;code&gt;sentence-transformers/all-MiniLM-L6-v2&lt;/code&gt;&lt;/a&gt; open-weight model, loaded with open-source &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;Transformers.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The browser produces normalized embeddings for the resume and job description. Their dot product supplies the semantic similarity signal. I blend that with explicit skill coverage so the final score combines meaning with concrete requirements. The app then shows matched skills, missing skills, and recommendations generated by deterministic, inspectable code.&lt;/p&gt;

&lt;p&gt;The first run downloads a quantized model. Later runs can reuse the browser cache.&lt;/p&gt;

&lt;p&gt;I verified the project with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm test
# 5 tests passed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also tested the deployed app end to end on desktop and mobile, including a real model download and inference run.&lt;/p&gt;

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

&lt;p&gt;A resume can contain a name, employment history, location, phone number, and other sensitive details. A closed API would require sending that material to somebody else's server.&lt;/p&gt;

&lt;p&gt;Open weights changed the architecture: inference runs inside the browser, the app needs no API key, and neither the resume nor job description is uploaded by JobFit Local. The model can also be inspected, cached, or replaced without rebuilding the product around a vendor.&lt;/p&gt;

&lt;p&gt;That is the practical value of open AI here—not just lower cost, but more control over personal career data.&lt;/p&gt;

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

&lt;p&gt;The most interesting design choice was balancing a semantic score with explainable signals. An embedding can tell me that two documents discuss similar work, but a job seeker also needs to see &lt;em&gt;why&lt;/em&gt;. Pairing local embeddings with explicit skill extraction made the result easier to act on and easier to challenge.&lt;/p&gt;

&lt;p&gt;I have not claimed made-up user feedback. Future me is the first intended user, and the project is ready for feedback from other job seekers after this submission.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Assistance Disclosure
&lt;/h2&gt;

&lt;p&gt;I used Notion AI as a coding and writing assistant. I reviewed the implementation, ran the tests, checked the responsive layouts, and verified the deployed open-weight model flow before submitting.&lt;/p&gt;

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