<?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: Samarth Kumble</title>
    <description>The latest articles on DEV Community by Samarth Kumble (@samarth_kumble_a91ad88634).</description>
    <link>https://dev.to/samarth_kumble_a91ad88634</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%2F4145941%2Fb7d35af3-f2a6-4a62-bbc8-1fc940f1c1f3.png</url>
      <title>DEV Community: Samarth Kumble</title>
      <link>https://dev.to/samarth_kumble_a91ad88634</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/samarth_kumble_a91ad88634"/>
    <language>en</language>
    <item>
      <title>I get 50 placement emails a week. A local Gemma now tells me which 4 I can apply to.</title>
      <dc:creator>Samarth Kumble</dc:creator>
      <pubDate>Sat, 24 Oct 2026 11:03:28 +0000</pubDate>
      <link>https://dev.to/samarth_kumble_a91ad88634/i-get-50-placement-emails-a-week-a-local-gemma-now-tells-me-which-4-i-can-apply-to-4l88</link>
      <guid>https://dev.to/samarth_kumble_a91ad88634/i-get-50-placement-emails-a-week-a-local-gemma-now-tells-me-which-4-i-can-apply-to-4l88</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I'm a final-year CSBS student, and it's placement season. Last week my college inbox got &lt;strong&gt;50&lt;/strong&gt; placement emails. Each one hides its CGPA cutoff, branch list, batch and deadline somewhere in the third paragraph, or doesn't say at all and leaves you to click through to the placement portal. Most aren't for me, or have already closed by the time I read them. I still have to open every one to find out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cutoff&lt;/strong&gt; reads them for me. An open-weight model, Gemma 4 E4B running in Ollama on my laptop, pulls the criteria out of each email. Plain code checks them against my profile. In the morning I get one short list:&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%2Footbts9vclfczfz54z51.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%2Footbts9vclfczfz54z51.png" alt="Cutoff's digest for one week of placement emails" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fifty emails become ten lines. Most lines carry the email's own Apply link, and each "need a look" says exactly why.&lt;/p&gt;

&lt;p&gt;It's for anyone on a college placement mailing list. My college uses Superset, and Superset sends every job to every student. You only find out you're not eligible when you click Apply.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/hjgIi2cwY4E" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;75 seconds: the real run on my inbox, the evidence behind one answer, the eval, and a run with Wi-Fi off. The voiceover is generated with ElevenLabs.&lt;/em&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/samarthkumble" rel="noopener noreferrer"&gt;
        samarthkumble
      &lt;/a&gt; / &lt;a href="https://github.com/samarthkumble/cutoff" rel="noopener noreferrer"&gt;
        cutoff
      &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;Cutoff&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A local Gemma reads your placement emails, so you only open the ones you can actually apply to.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Final-year placement season means a dozen emails a day. Each one hides a CGPA cutoff, a branch list, a batch and a deadline somewhere in the third paragraph, or doesn't say at all and leaves you to click through to the portal. Most of them rule you out. You still have to open every one to find out.&lt;/p&gt;
&lt;p&gt;Cutoff reads them for you, using an open-weight model on your own laptop. Here's a real run over one week of my inbox (50 emails, BMS College of Engineering, CSBS, 2027 batch, CGPA 7.08):&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/samarthkumble/cutoff/docs/digest.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fsamarthkumble%2Fcutoff%2FHEAD%2Fdocs%2Fdigest.png" alt="Cutoff's digest for one week of placement emails"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;Cutoff · Fri 23 Oct
4 drives you can apply to (from 50 emails):
  ✓ IBM — Software Developer · apply by Sat 24 Oct, 11:00 (×3 emails)
  ✓ First Advantage Pvt Ltd — Associate Software Engineer Trainee ·&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/samarthkumble/cutoff" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;h3&gt;
  
  
  A 4B model is a confident form-filler
&lt;/h3&gt;

&lt;p&gt;Gemma reads one email and fills a form: company, role, minimum CGPA, minimum %, branches, batch, max active backlogs, deadline. &lt;strong&gt;Every value has to come with the exact sentence it came from.&lt;/strong&gt; Then plain Python checks two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Is that sentence really in the email?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is the value really in that sentence?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If either check fails, Gemma gets one retry that names the rejected value and the reason. If it fails again, the value becomes UNKNOWN.&lt;/p&gt;

&lt;p&gt;That leads to the one rule the whole project is built on:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;UNKNOWN can send a drive to "check it yourself", but never to "not eligible".&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Being told to skip a drive you could have applied to is the expensive mistake. Opening one extra email is the cheap one.&lt;/p&gt;

&lt;h3&gt;
  
  
  I measured it on my real inbox
&lt;/h3&gt;

&lt;p&gt;I exported my 50 latest placement emails, with classmates' names and addresses scrubbed, and labelled every field by hand. For drives whose emails don't state criteria, I opened each job on Superset to see whether it would let me apply. Then I ran three things against those labels: a regex baseline with no AI, Gemma with my first prompt, and Gemma with my third.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Regex, no AI&lt;/th&gt;
&lt;th&gt;Gemma, prompt v1&lt;/th&gt;
&lt;th&gt;Gemma, prompt v3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Told "not eligible" but I was&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Told "eligible" but I wasn't&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sent to "check it yourself"&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Company / role correct&lt;/td&gt;
&lt;td&gt;0% / 22%&lt;/td&gt;
&lt;td&gt;100% / 91%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100% / 100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Branch list correct&lt;/td&gt;
&lt;td&gt;69%&lt;/td&gt;
&lt;td&gt;81%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seconds per email (median, Ryzen 5 5500U laptop, no GPU)&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;39&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Emails that needed a retry&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;From the very first run, Gemma got all 32 CGPA cutoffs and all 32 percentage cutoffs right. Everything interesting happened in the other fields.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Gemma got wrong, and what fixed it
&lt;/h3&gt;

&lt;p&gt;Every run writes a report listing each mistake with its evidence. These are real ones:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. It invented "All branches".&lt;/strong&gt; Superset's "Open for application" emails say nothing about branches. In v1, Gemma filled in &lt;code&gt;["All branches"]&lt;/code&gt; for almost every one of them. Grounding rejected each one ("the evidence is not copied word-for-word from the email"), and that's where most of the 16 retries came from. In v2 the prompt says to return "All branches" &lt;em&gt;only if the email says so&lt;/em&gt;. Retries dropped from 16 to 2, and the median time per email from 67 s to 42 s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. It read a batch year from a file name.&lt;/strong&gt; It quoted &lt;code&gt;KPMG_Format_(Registrations-UG) - 2027.xlsx&lt;/code&gt; as evidence that the drive is for the 2027 batch. It also read "for a January 2027 start" as a graduation year. Prompt instructions didn't stop either one, so I made the check stricter: a batch year's evidence now has to say &lt;em&gt;batch&lt;/em&gt;, &lt;em&gt;graduating&lt;/em&gt;, &lt;em&gt;passing out&lt;/em&gt; or similar. Text from the attachment list doesn't count as evidence at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. It called a category a role.&lt;/strong&gt; "Job Profile Category : Tier 1" became the role "Tier 1". One line in the prompt fixed it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. It applied one role's rule to the whole email.&lt;/strong&gt; NxtWave's email offered two roles. Only one of them said "Open to 2026 graduating students", but Gemma applied that to the whole email and Cutoff told me I wasn't eligible. Telling it in the prompt not to do that didn't work. What did work was &lt;strong&gt;asking it a yes/no question instead&lt;/strong&gt;: &lt;em&gt;does this email have several roles with different criteria?&lt;/em&gt; Gemma answered that correctly, and the code takes care of the rest: failing one role's rule now means "check", not "no". That was the biggest lesson of the week. &lt;strong&gt;Don't hand a small model a policy. Ask it a question, and let the code decide what follows.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some mistakes were mine, not Gemma's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quoted replies.&lt;/strong&gt; Forwarded emails start their lines with &lt;code&gt;&amp;gt;&lt;/code&gt;, so a correctly quoted sentence failed the word-for-word check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toyota.&lt;/strong&gt; Gemma correctly read "2027 passing out". My rules then called the drive eligible, even though the email says the rest of the criteria are "mentioned in the above attachment". Now that phrase blocks a clean "eligible".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Four of my own labels were wrong.&lt;/strong&gt; I listed each correction, with its reason, in the labels file.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Things only a real inbox teaches you
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The same drive arrives in 2–3 emails.&lt;/strong&gt; IBM sent a forwarded company email with full criteria, plus two Superset notices with none. Cutoff matches them by company, so the notices borrow the forwarded email's criteria. That alone turned 8 "check" results into real answers. Borrowing can turn "check" into "eligible", but never into "not eligible", because the other email might be about a different role.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"CS" is not "CSE".&lt;/strong&gt; Superset let me (CSBS) apply where the email said "CS", for IBM and KPMG. It didn't where the email spelled out "Computer Science &amp;amp; Engineering", for Tejas Networks. I'd never have guessed that, so it's two separate switches in my profile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"70%/7.0 CGPA" is an either-or, and it only applies to the degree.&lt;/strong&gt; "60% throughout in 10th, 12th, Graduation" applies to all three. Cutoff reads which marks a cutoff covers from the sentence that states it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hackathons promise PPOs.&lt;/strong&gt; Gemma kept calling some of them drives, so a rule on the subject line now skips them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What it still can't see
&lt;/h3&gt;

&lt;p&gt;The one remaining "not eligible" mistake is EY's email asking the college to confirm a schedule. Gemma says it isn't a drive, and honestly that's arguable. Of the 10 "check" results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;6 have no criteria anywhere in the email:&lt;/strong&gt; three Superset notices for EY, one each for BCE and Tata Power, and Migsak's own email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3 keep them in an attachment:&lt;/strong&gt; two Invictus emails and Toyota.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1 is NxtWave's two-role email.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For all of those, "check it yourself" is the correct answer. A next step would be reading the attached JD PDFs.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;My data stays on my laptop.&lt;/strong&gt; My CGPA, backlogs, marks and my college inbox, along with my classmates' names in forwarded emails, never leave it. I wouldn't paste a week of placement emails into a hosted API, and most students shouldn't either.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retries are free, so the checks can be strict.&lt;/strong&gt; On a paid API, every rejected value costs money, and there's pressure to accept "close enough". Locally a retry just takes 40 seconds, so Cutoff rejects anything it can't verify.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The same email always gets the same answer.&lt;/strong&gt; Temperature 0, a fixed seed and a cache keyed on (model, prompt version, email) mean that. That made the evaluation trustworthy. It also meant that after changing a &lt;em&gt;rule&lt;/em&gt;, I could re-score all 50 emails in seconds instead of re-running Gemma for 35 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honestly, a bigger hosted model would probably need fewer retries&lt;/strong&gt; and might read the PDFs too. But for this job a 4B model on a laptop is enough, and it's mine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before:&lt;/strong&gt; open 50 emails a week, read each one down to its eligibility paragraph, and click through to Superset for the ones that don't say.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Now:&lt;/strong&gt; read 10 lines. 4 say apply, with the link. 6 say check, with the reason. Everything else (6 not eligible, 11 closed, 18 not drives) I never see.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model is lazy in the right way too. It's slow, about 40 s an email on my laptop (an AMD Ryzen 5 5500U with 16 GB RAM and no dedicated GPU), but it runs while I sleep, and nobody needs a placement digest in 200 ms. Slow and steady.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma 4 E4B, running locally through Ollama, is the only model in Cutoff. The project is about making a small open model &lt;em&gt;trustworthy&lt;/em&gt; on a real task: every value is grounded in a quote, one retry is targeted at the exact problem, UNKNOWN is never treated as "no", and it's measured against hand labels across three prompt versions.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
