惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
Google DeepMind News
Google DeepMind News
S
SegmentFault 最新的问题
Project Zero
Project Zero
D
DataBreaches.Net
I
InfoQ
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
The Register - Security
The Register - Security
Recorded Future
Recorded Future
Vercel News
Vercel News
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
I
Intezer
The Hacker News
The Hacker News
F
Fortinet All Blogs
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
Help Net Security
Help Net Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Scott Helme
Scott Helme
T
Threatpost
爱范儿
爱范儿
N
Netflix TechBlog - Medium
D
Docker
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
K
Kaspersky official blog
H
Help Net Security
S
Secure Thoughts
T
Threat Research - Cisco Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security @ Cisco Blogs
Cyberwarzone
Cyberwarzone
N
News and Events Feed by Topic
G
Google Developers Blog
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
B
Blog
Google DeepMind News
Google DeepMind News
Recent Announcements
Recent Announcements
Simon Willison's Weblog
Simon Willison's Weblog
S
Securelist
P
Privacy International News Feed
Spread Privacy
Spread Privacy
The Last Watchdog
The Last Watchdog

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
I Built ResuMate! A 100% Private, Local AI Resume Optimizer with Google Gemma 4
deeptej (⁠^⁠ · 2026-05-25 · via DEV Community

This is a submission for the Gemma 4 Challenge: Build with Gemma 4

Working right after graduation ShinChan meme

See why I chose the Gemma 4 E2B model

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...

But somewhere between hitting enter and reading the response, a thought crept in: where did all of that personal information just, go?

A resume is NOT 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.

I couldn't shake that feeling off. So I built something to FIX IT!!

What I Built

ResuMate is a privacy-first resume tailoring tool that runs ENTIRELY on your local machine, thanks to Gemma 4!. Your resume and YOUR personal information never leaves your laptop. Not a single character!

Dashboard

You upload your resume once. Then for every job you're interested in, you paste the job description and ResuMate does six things:

  • ATS match analysis: Scores your resume against the job description from 0 to 100. Shows you exactly which keywords are present, which are missing, and gives you specific, actionable suggestions to improve your score without fabricating experience you don't have.

ATS Match 1

ATS Match 2

  • Drafts a cover letter: The model first reads the tone of the job description, 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 YOUR actual achievements, thanks to Gemma 4's context window of up to 256K token!

Cover letter

  • Job Description Decoder: 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). "Operationalize strategic pillars to achieve sustainable, scalable leverage" ???? 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.

Job description decoder

  • Red Flag Detector: 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~

Red Flags Detector

  • Interview Prep: This one is another one of my favorites! and it also comes from a personal experience!

Interview Prep

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!

ResuMate generates questions tailored to both the role requirement and your specific background. **This does not include generic "Tell me your weaknesses and strengths" 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. Pretty cool right?

  • Generate a tailored resume: 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.

Tailored resume

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! No re-running, no re-uploading. 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!

Jobs on dashboard


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.

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


Demo

Code

Find the source code for ResuMate and how you can download and run it on your machine on GitHub: ResuMate on GitHub

Why Gemma 4 E2B

gemma 4 e2b from hugginface

The inputs are text, and both models handle text identically.

ResuMate relies on two text documents as input- a resume and a job description. Both Gemma 4 E2B and Gemma 4 E4B share the same context window of 128K tokens and the same 262K vocabulary. 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.

My own hardware told me who my users are

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.

no way 4gb ram ahh

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.

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

Speed makes or breaks the entire user experience

sloth from zootopia

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.

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.

How I Used Gemma 4

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

You can check out the prompts here: ResuMate/blob/main/core/ollama.py#L76

the flow

  • The ATS analysis 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.

  • The job description decoder 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 "Operationalize strategic pillars to achieve sustainable, scalable leverage" means 😭

  • The cover letter generator 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!

  • The interview prep 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.

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

What I learnt

  • Prompt engineering is harder than it looks.
    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.

  • Thinking about constraints
    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.

What worked well

  • Finally build my first project with a local LLM
    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!

  • Gotta love Django
    File uploads, streaming HTTP responses, SQLite db, template rendering, everything just worked. No fighting with the framework.

What I Plan to Improve

  • Browser extension for automatic JD import 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.

Conclusion

Every technical decision while building ResuMate traced back to one very important thing: the model has to run on your machine, privately, on hardware you actually own. 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!

Thanks for reading so far!! I hope we all get the role we're dreaming of! ✨🌸 See y'all in another post!! 👋🏻
byee