<?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: deeptej (⁠^⁠.⁠_⁠.⁠^⁠)⁠ﾉ</title>
    <description>The latest articles on DEV Community by deeptej (⁠^⁠.⁠_⁠.⁠^⁠)⁠ﾉ (@deeptej).</description>
    <link>https://dev.to/deeptej</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1000953%2F0787906d-63ea-4c0f-84a7-347f5651ffbd.png</url>
      <title>DEV Community: deeptej (⁠^⁠.⁠_⁠.⁠^⁠)⁠ﾉ</title>
      <link>https://dev.to/deeptej</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deeptej"/>
    <language>en</language>
    <item>
      <title>A 100% Private, Local AI Resume Optimizer with Google Gemma 4: How I Built ResuMate!</title>
      <dc:creator>deeptej (⁠^⁠.⁠_⁠.⁠^⁠)⁠ﾉ</dc:creator>
      <pubDate>Sun, 24 May 2026 19:10:57 +0000</pubDate>
      <link>https://dev.to/deeptej/i-built-resumate-a-100-private-local-ai-resume-optimizer-with-google-gemma-4-699</link>
      <guid>https://dev.to/deeptej/i-built-resumate-a-100-private-local-ai-resume-optimizer-with-google-gemma-4-699</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;Gemma 4 Challenge: Build with Gemma 4&lt;/a&gt;&lt;/em&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F81idlv0kgrlv6nnljuqe.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.amazonaws.com%2Fuploads%2Farticles%2F81idlv0kgrlv6nnljuqe.png" alt="Working right after graduation ShinChan meme" width="800" height="781"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See why I chose the Gemma 4 E2B model&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I was recently preparing for my internship applications and like everyone else I wanted my resume to be as good as it could possibly be. So I uploaded my entire education history to a website that claimed to rate and improve my resume. I entered every project, every achievement, my phone number, my email, links to my GitHub and LinkedIn, hit enter and waited...&lt;/p&gt;

&lt;p&gt;But somewhere between hitting enter and reading the response, a thought crept in: &lt;em&gt;where did all of that personal information just, go?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A resume is &lt;strong&gt;NOT&lt;/strong&gt; a casual document. It has my address on it, my education history, the names of professors and mentors I listed as references. And I had just handed all of it to a server I knew nothing about, owned by a company whose privacy policy I have definitely never read.&lt;/p&gt;

&lt;p&gt;I couldn't shake that feeling off. &lt;em&gt;So I built something to FIX IT!!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;strong&gt;ResuMate&lt;/strong&gt; is a &lt;em&gt;privacy-first&lt;/em&gt; resume tailoring tool that runs ENTIRELY on your local machine, thanks to &lt;a href="https://deepmind.google/models/gemma/gemma-4/" rel="noopener noreferrer"&gt;Gemma 4&lt;/a&gt;!. Your resume and YOUR personal information never leaves your laptop. Not a single character!&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.amazonaws.com%2Fuploads%2Farticles%2F7lg180mmm5ro3qr14ukn.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.amazonaws.com%2Fuploads%2Farticles%2F7lg180mmm5ro3qr14ukn.png" alt="Dashboard" width="800" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You upload your resume once. Then for every job you're interested in, you paste the job description and ResuMate does &lt;strong&gt;six things:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ATS match analysis:&lt;/strong&gt; Scores your resume against the job description from 0 to 100. Shows you exactly which keywords are present, which are missing, and &lt;u&gt;gives you specific, actionable suggestions to improve your score&lt;/u&gt; without fabricating experience you don't have.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fum88q9auqnn9m2tnkmbh.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.amazonaws.com%2Fuploads%2Farticles%2Fum88q9auqnn9m2tnkmbh.png" alt="ATS Match 1" width="800" height="620"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fvshyj3oe7xco5z5t0ook.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.amazonaws.com%2Fuploads%2Farticles%2Fvshyj3oe7xco5z5t0ook.png" alt="ATS Match 2" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Drafts a cover letter:&lt;/strong&gt; The model &lt;strong&gt;first reads the tone of the job description&lt;/strong&gt;, asks itself, is this a corporate law firm or a startup? and drafts a cover letter best suited for that world. Most importantly, it uses &lt;strong&gt;YOUR&lt;/strong&gt; actual achievements, thanks to &lt;strong&gt;Gemma 4's context window of up to 256K token!&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2F3uqo8pv9qpyuk2br98rl.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.amazonaws.com%2Fuploads%2Farticles%2F3uqo8pv9qpyuk2br98rl.png" alt="Cover letter" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Job Description Decoder:&lt;/strong&gt; This one is my personal favorite. A lot of times companies use a lot of corporate jargon and I'm just steppin' out of college :) ResuMate reads the job description and translates corporate lingo into plain english (phew, now that's better). &lt;em&gt;"Operationalize strategic pillars to achieve sustainable, scalable leverage"&lt;/em&gt; ???? like whaa? The decoder effectively surfaces what the company is trying to say, all while also using the context that the entire job description provides.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fy6ftvg10g8wvlscyooqu.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.amazonaws.com%2Fuploads%2Farticles%2Fy6ftvg10g8wvlscyooqu.png" alt="Job description decoder" width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Red Flag Detector:&lt;/strong&gt; ResuMate looks for patterns in the job description that may be something you might want to know before applying or is worth asking during the interview. Each flag comes with severity rating and specific questions you can ask during the interview as well! Now that's convenient~&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2F2lnco2yexqxdzcm5mp5u.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.amazonaws.com%2Fuploads%2Farticles%2F2lnco2yexqxdzcm5mp5u.png" alt="Red Flags Detector" width="800" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interview Prep:&lt;/strong&gt; This one is another one of my favorites! and it also comes from a personal experience! &lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fhfm79rkes4tqx92xqtpp.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.amazonaws.com%2Fuploads%2Farticles%2Fhfm79rkes4tqx92xqtpp.png" alt="Interview Prep" width="800" height="714"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Whenever I look at job descriptions that I might seem fit for, I immediately start thinking about the type of questions that might be asked for such a role and the topics that I might want to prep for the role, I built this feature to tackle just that!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ResuMate generates &lt;strong&gt;questions tailored to both the role requirement and your specific background. **This does not include generic &lt;em&gt;"Tell me your weaknesses and strengths"&lt;/em&gt; type questions. Each question also comes with an explaination of what the interviewer is actually testing and how to approach a strong answer  using your real experience. ResuMate also **recommends a few topics that you might want to brush up before the interview based on the keywords it picks up from the job description.&lt;/strong&gt; Pretty cool right?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generate a tailored resume:&lt;/strong&gt; Gemma reorganizes and emphasizes on your existing experience and structure it to match the priorities of the job description. It incorporates missing keywords if the user already has the experience but not the specific keywords. Once done the user can directly export the tailored resume to a PDF. And the best part, every job page has its own tailored version of resume, so you don't need to download and store multiple versions, they'll always stay under the job card.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fkfboofubny6jslzcn0s5.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.amazonaws.com%2Fuploads%2Farticles%2Fkfboofubny6jslzcn0s5.png" alt="Tailored resume" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every job you analyse is saved locally so you can have a cup of tea or go for a walk and everything is stays exactly where you left it! &lt;strong&gt;No re-running, no re-uploading.&lt;/strong&gt; The dashboard shows your full history with ATS scores for every job at a glance. This not only saves time but also gives you a birds eye view of every job you've looked at!&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.amazonaws.com%2Fuploads%2Farticles%2Fo8su9yo03m2lfrfghncn.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.amazonaws.com%2Fuploads%2Farticles%2Fo8su9yo03m2lfrfghncn.png" alt="Jobs on dashboard" width="799" height="243"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;The thing that makes ResuMate different from every other AI resume tools isn't just any single feature. It's the direction the analysis runs in.&lt;/p&gt;

&lt;p&gt;Most tools are one directional. They optimise you for the job. &lt;strong&gt;ResuMate is bidirectional.&lt;/strong&gt; &lt;u&gt;It optimises your application and it analyses the job on your behalf.&lt;/u&gt; The job description decoder and red flag detector exist because &lt;strong&gt;a job application is not just you auditioning for a company, it's also the company auditioning for you.&lt;/strong&gt; &lt;em&gt;You should go into that interview having done your homework on both sides.&lt;/em&gt; &lt;/p&gt;




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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/RacHlwbpSpQ"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

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

&lt;p&gt;Find the source code for ResuMate and how you can download and run it on your machine on GitHub: &lt;a href="https://github.com/deeptejd/ResuMate" rel="noopener noreferrer"&gt;ResuMate on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Gemma 4 E2B
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2Fgstptb75fs6lzy036ien.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.amazonaws.com%2Fuploads%2Farticles%2Fgstptb75fs6lzy036ien.png" alt="gemma 4 e2b from hugginface" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The inputs are text, and both models handle text identically.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ResuMate relies on two text documents as input- a resume and a job description. &lt;a href="https://huggingface.co/google/gemma-4-E2B#dense-models" rel="noopener noreferrer"&gt;Both Gemma 4 E2B and Gemma 4 E4B share the same context window of 128K tokens and the same 262K vocabulary&lt;/a&gt;. For a task like resume analysis, these were the numbers that mattered to me. A resume and a job description rarely exceed a few thousand tokens. E2B handles this without breaking a sweat and E4B would handle it the same way, so there wasn't really a capability gap to close by going bigger.&lt;/p&gt;

&lt;h3&gt;
  
  
  My own hardware told me who my users are
&lt;/h3&gt;

&lt;p&gt;This is the reason I feel the most strongly about. When I tried running E4B locally during development, it would not even initialise on my machine. I have 4GB of total RAM, with perhaps 1 to 2GB realistically available after everything else running. E4B needs more than that to load, let alone run inference. E2B initialised, ran, and was fast.&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.amazonaws.com%2Fuploads%2Farticles%2F2f0r48jdfyt5te7b22g4.gif" 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.amazonaws.com%2Fuploads%2Farticles%2F2f0r48jdfyt5te7b22g4.gif" alt="no way 4gb ram ahh" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This made me realise about who ResuMate is actually for. The target audience is students and fresh graduates, people who are actively looking for their first job or first internship. That group, is usually not running high-end hardware. They are on a similar kind of laptop I was on. If the tool that is supposed to help them with their job search cannot even start on their machine, it has already failed them before they typed a single word.&lt;/p&gt;

&lt;p&gt;E2B runs on modest hardware. &lt;strong&gt;It has the same context length and vocabulary as E4B.&lt;/strong&gt; It is faster on constrained resources. This was enough for me to single out which model I am going to go with.&lt;/p&gt;

&lt;h3&gt;
  
  
  Speed makes or breaks the entire user experience
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2Fkix3e80lupi1xff6l7ck.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fkix3e80lupi1xff6l7ck.gif" alt="sloth from zootopia" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;LocalHire runs six sequential prompts every time you analyze a job. This means six round trips to the model before you see a complete analysis. If each prompt takes noticeably longer due to a heavier model, that slowdown really adds up across the entire session. &lt;/p&gt;

&lt;p&gt;And job seekers aren't just going to do a single analysis. They might be looking at tens of roles eveyr week. I wanted every analysis to feel as fast as possible, not something you start and come back to, later. E2B generates tokens faster on the same hardware, and across six prompts per-job that difference is something users would really feel. &lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Gemma 4
&lt;/h2&gt;

&lt;p&gt;There are a total of six resume tasks that are run per job. Gemma 4 runs these, each with its own carefully designed prompt.&lt;/p&gt;

&lt;p&gt;You can check out the prompts here: &lt;a href="https://github.com/deeptejd/ResuMate/blob/main/core/ollama.py#L76" rel="noopener noreferrer"&gt;ResuMate/blob/main/core/ollama.py#L76&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F1jzeuqu7m7cjfiuyo025.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.amazonaws.com%2Fuploads%2Farticles%2F1jzeuqu7m7cjfiuyo025.png" alt="the flow" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;ATS analysis&lt;/strong&gt; asks the model to read two documents simultaneously, identify semantic relationships between the terms rather than just extracting keywords, produce a numeric score, categorize the keywords into two lists i.e. found and missing and generate suggestions to improve the score- all in a structured markdown format that the website can parse and render. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;job description decoder&lt;/strong&gt; which for me was one of the hardest prompts to get right. Corpo lingo carries meaning that depends a lot of context. Getting Gemma to decode phrases honestly, required multiple attempts to get right. And I can finally understand what &lt;em&gt;"Operationalize strategic pillars to achieve sustainable, scalable leverage"&lt;/em&gt; means 😭&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;cover letter generator&lt;/strong&gt; does multiple things- detect the tone of the JD, match it in the response, avoid certain types of opening statements like "I am writing..." and referencing only real experience for the user's resume and not hallucinating all whilst staying within three paras. Gemma 4 handles this really well provided the instructions are explicit enough, and I got to pick up a bit of prompt engineering along the way!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;interview prep&lt;/strong&gt; feature required Gemma 4 to cross-reference the two documents viz. the resume and the job description, and figure out the gap between them to suggest questions that help fill that gap, instead of generic interview questions, which made this even more personal.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these prompts streams back to the browser token by token using &lt;strong&gt;Server-Sent Events&lt;/strong&gt;. Django keeps a persistent connection open and forwards each token from Ollama as it arrives.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt engineering is harder than it looks.&lt;/strong&gt;&lt;br&gt;
I assumed writing a prompt was just... asking nicely 😭 boy was I wrong. It isnt. Getting Gemma to produce output in a consistent, parseable format took more tries than I expected. Early versions of my prompts produced beautifully written responses that my code could not parse at all. The minute I started telling it, here is exactly what I want, here is exactly how I want it formatted, here is an example, everything got more reliable. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Thinking about constraints&lt;/strong&gt;&lt;br&gt;
Because I was running everything on my own machine I had to constantly think about RAM limits, inference speeds etc. These are constraints that disappear when you use cloud API. Building locally helped me think in constraints.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What worked well
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Finally build my first project with a local LLM&lt;/strong&gt;&lt;br&gt;
I hadn't incorporated a locally running LLM with a project before and I finally got a chance to do it, so that's pretty cool!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gotta love Django&lt;/strong&gt;&lt;br&gt;
File uploads, streaming HTTP responses, SQLite db, template rendering, everything just worked. No fighting with the framework.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Plan to Improve
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Browser extension for automatic JD import&lt;/strong&gt;
Right now users paste job descriptions manually. The real workflow is: see a job on LinkedIn or Naukri or Indeed, click a button, have the JD extracted automatically. Perhaps a small browser extension that reads the page content and sends it to the local Django server would eliminate the only friction that remains in the core workflow. This is the next feature I want to build.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Every technical decision while building ResuMate traced back to one very important thing: &lt;strong&gt;the model has to run on your machine, privately, on hardware you actually own.&lt;/strong&gt; That constraint ruled out cloud APIs, ruled out the larger models, and helped me go with Gemma 4 E2B as my model of choice. The constraints did not limit the project, but they defined it!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Thanks for reading so far!! I hope we all get the role we're dreaming of! ✨🌸 See y'all in another post!! 👋🏻&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fydrocpql96w2c30eit6v.webp" 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.amazonaws.com%2Fuploads%2Farticles%2Fydrocpql96w2c30eit6v.webp" alt="byee" width="480" height="268"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Fusing NASA Data with AI: How I Built CosmoDex and Won the MLH Data Hackfest!</title>
      <dc:creator>deeptej (⁠^⁠.⁠_⁠.⁠^⁠)⁠ﾉ</dc:creator>
      <pubDate>Tue, 03 Mar 2026 11:25:11 +0000</pubDate>
      <link>https://dev.to/deeptej/fusing-nasa-data-with-ai-how-i-built-cosmodex-and-won-the-mlh-data-hackfest-5fmm</link>
      <guid>https://dev.to/deeptej/fusing-nasa-data-with-ai-how-i-built-cosmodex-and-won-the-mlh-data-hackfest-5fmm</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh-built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What if tracking near-Earth asteroids felt less like reading a spreadsheet and more like commanding a starship? That was the exact question that led to the birth &lt;strong&gt;CosmoDex!&lt;/strong&gt;🪐🚀🚀&lt;/em&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fj1zi54s5lau0p9zadil5.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fj1zi54s5lau0p9zadil5.gif" alt="stargazing" width="600" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built with Google Gemini
&lt;/h2&gt;

&lt;p&gt;Space is fascinating, but astronomical data is usually presented as dry, intimidating pages of text or raw JSON files. I wanted to change that! I wondered, &lt;strong&gt;&lt;em&gt;What if you could instead just, TALK to the data!!!&lt;/em&gt;&lt;/strong&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F66suth9d9iuqqi7gbvw4.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.amazonaws.com%2Fuploads%2Farticles%2F66suth9d9iuqqi7gbvw4.png" alt="Details about an asteroid and Quackstronaut analyzing it" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So with a clear goal in mind and a weekend to spare, I built CosmoDex! 🥹🚀 an interactive, highly visual dashboard that tracks Near Earth Objects (NEOs) using real-time data from NASA's API, allows you to ask questions about what you're seeing with the power of &lt;strong&gt;Gemini&lt;/strong&gt; and unlock shiny badges while doing all this! I didn’t just want to build a data table, I wanted to build an experience ✨ I heavily drew inspiration from sci-fi movies like Intersteller (my favorite btw) and Gravity, utilizing glowing neon accents 🌟, deep space backgrounds 🌠, and a head up display style aesthetic to make users feel like they are stationed at a futuristic command center 🛰️&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Oh and psst...(whispers) &lt;em&gt;"You think I'd let you be stranded in space like that? Well Ohhh boyy"&lt;/em&gt; I bring to you &lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Flipb1kvq7wepxgg0kks1.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Flipb1kvq7wepxgg0kks1.gif" alt="Mandalorian" width="500" height="281"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;drumrollss&lt;/strong&gt;&lt;/em&gt;🥁 &lt;strong&gt;"QUACKSTRONAUT"&lt;/strong&gt; 🦆&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quackstronaut is your friendly AI (Always Intriguing) sidekick that gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily briefings about cool space facts!!&lt;/li&gt;
&lt;li&gt;Information about any asteroid you're currently seeing, powered by Gemini, we can simply ask it a question in our natural language, just like you'd ask your pal! 🦆&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Feaiemwyqgun5fyrnyz9n.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Feaiemwyqgun5fyrnyz9n.jpg" alt="Quackstonaut briefing" width="265" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally to gamify it even further we have ✨&lt;strong&gt;&lt;em&gt;Achievements!&lt;/em&gt;&lt;/strong&gt;✨. Interactions on the site such as favoriting near earth objects, asking quackstronaut for more information etc unlocks cool achievements that are visible on your profile!!&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.amazonaws.com%2Fuploads%2Farticles%2F41jmf15t3s874bk6ijuj.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.amazonaws.com%2Fuploads%2Farticles%2F41jmf15t3s874bk6ijuj.png" alt="Achievements" width="800" height="975"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What role did Google Gemini play?
&lt;/h3&gt;

&lt;p&gt;While the NASA API provided the raw numbers (velocity, distance, estimated diameter), I fed the raw asteroid data into Gemini and prompted it to generate dynamic, gamified threat assessments and sci-fi lore for each specific space rock. Instead of just seeing "(2012 FU35): 0.05 AU away," users get an immersive briefing about an incoming celestial body, making the data highly engaging and accessible.&lt;/p&gt;

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

&lt;p&gt;You can find the source code for the project here: &lt;a href="https://github.com/DeeptejD/data-hackfest" rel="noopener noreferrer"&gt;DeeptejD/data-hackfest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/H9WLzTXALXw"&gt;
  &lt;/iframe&gt;
&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.amazonaws.com%2Fuploads%2Farticles%2Fju9e2ujrisy2ac93txo8.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.amazonaws.com%2Fuploads%2Farticles%2Fju9e2ujrisy2ac93txo8.png" alt="The homepage" width="800" height="398"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Frkwric5totsl0v6yq2en.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.amazonaws.com%2Fuploads%2Farticles%2Frkwric5totsl0v6yq2en.png" alt="Asteoroid info" width="800" height="684"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F41jmf15t3s874bk6ijuj.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.amazonaws.com%2Fuploads%2Farticles%2F41jmf15t3s874bk6ijuj.png" alt="Achievements" width="800" height="975"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F49b0cf4mbxayoqqmo4wl.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.amazonaws.com%2Fuploads%2Farticles%2F49b0cf4mbxayoqqmo4wl.png" alt="vault containing favorited near earth objects" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Building CosmoDex was a massive learning experience spanning both code and design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Designing for Immersion (UI/UX):&lt;/em&gt;&lt;/strong&gt; I learned that good UI isn't just about making things look "cool" it’s about visual hierarchy. I had to balance the intense, futuristic sci-fi aesthetics with actual readability so the NASA data which was the star of the project didn't get lost in the design.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Speaking in a video (Soft Skill): Gosh I had to do like 6-7 takes  to get the video right and realised its sooo hard to speak in front of the camera! But I eventually did it and feel much more confident about it now.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Working with GenAI:&lt;/em&gt;&lt;/strong&gt; This was the first time I worked with GenAI so my technical skills were pushed to the limit. I had to reliably pass data fetched from NASA into an LLM prompt (Gemini) and parse the response back into our frontend without breaking the immersion. I also learnt a little bit about prompt engineering and how to structure good prompts!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;State Management &amp;amp; Async Loading: Waiting for an AI to generate a story takes a few seconds. I learned a lot about handling asynchronous data streams and creating sleek loading states like animations so the user stays engaged while Gemini did its thing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;p&gt;Working with Gemini was a new and really cool experience. Seeing raw data turn into a lore was honestly super cool. But like all things it came with its own set of pros and cons...&lt;/p&gt;

&lt;h3&gt;
  
  
  What worked well?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I was literally building a persona that was in my head "Quackstronaut" and Gemini was really adaptable to the persona I exactly imagined. It perfectly captured the astronaut side-kick and sci-fi vibe I was going for! &lt;/li&gt;
&lt;li&gt;Something that really impressed me was its ability to take cold hard numbers like velocity and come up with some creative lore or story.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What caused friction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gemini worked well as long as the prompt was well structured. Nailing that prompt was a bit difficult for me since this was my first time.&lt;/li&gt;
&lt;li&gt;Since I was dealing with scientific data it became more important that Gemini didn't hallucinate which it did sometimes by throwing in random numbers here and there&lt;/li&gt;
&lt;li&gt;latency was something that made the platform feel a bit slow, but this was mainly because I was using the Gemini flash models instead of the pro models&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Thanks for reading so far!! Will see you in another post explorer!&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fhgz4g94b4q39trm4s3pz.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fhgz4g94b4q39trm4s3pz.gif" alt="bye" width="480" height="268"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
