<?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: yanan wei</title>
    <description>The latest articles on DEV Community by yanan wei (@yanan_wei_1f47482c2627544).</description>
    <link>https://dev.to/yanan_wei_1f47482c2627544</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%2F3853022%2F2effc995-3907-43f6-832d-c5d4e413a964.png</url>
      <title>DEV Community: yanan wei</title>
      <link>https://dev.to/yanan_wei_1f47482c2627544</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yanan_wei_1f47482c2627544"/>
    <language>en</language>
    <item>
      <title>The Problem No One Talks About</title>
      <dc:creator>yanan wei</dc:creator>
      <pubDate>Tue, 31 Mar 2026 08:47:22 +0000</pubDate>
      <link>https://dev.to/yanan_wei_1f47482c2627544/the-problem-no-one-talks-about-306g</link>
      <guid>https://dev.to/yanan_wei_1f47482c2627544/the-problem-no-one-talks-about-306g</guid>
      <description>&lt;p&gt;You spend hours crafting the perfect resume. You tailor it to the job description. You hit submit with hope.&lt;/p&gt;

&lt;p&gt;And then... silence.&lt;/p&gt;

&lt;p&gt;Sound familiar? You're not alone. Studies show that 75% of resumes are rejected by ATS (Applicant Tracking Systems) before a human ever sees them. That's not a typo. Three out of four applications disappear into a digital void.&lt;/p&gt;

&lt;p&gt;The worst part? Job seekers have no idea why. Was it the format? The keywords? The length? No feedback. Just another "application received" email that goes nowhere.&lt;/p&gt;

&lt;p&gt;So I Built Smart Resume&lt;br&gt;
&lt;a href="https://smart-resume-now.top/" rel="noopener noreferrer"&gt;Smart Resume is a free tool that analyzes your resume against any job description and tells you exactly what's wrong—and how to fix it.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what it does:&lt;/p&gt;

&lt;p&gt;Keyword Match Analysis — Extracts keywords from the job description and shows you which ones you're missing&lt;br&gt;
Frequency Tracking — Tells you if a keyword appears too few or too many times&lt;br&gt;
Action Verb Detection — Flags passive language that weakens your resume&lt;br&gt;
Quantified Achievement Check — Reminds you to add numbers (increased sales by 20%, reduced load time by 50%)&lt;br&gt;
Prioritized Suggestions — Not all fixes are equal. Get high/medium/low impact recommendations&lt;br&gt;
ATS-Friendly Templates — 9 templates tested for ATS compatibility&lt;br&gt;
How It Works Under the Hood&lt;br&gt;
Tech Stack&lt;br&gt;
Cloudflare Workers — Edge computing for fast, serverless API&lt;br&gt;
Vue 3 — Lightweight, reactive frontend&lt;br&gt;
No database required — All processing happens in real-time&lt;br&gt;
The Keyword Extraction Pipeline&lt;br&gt;
The core feature is extracting keywords from job descriptions and matching them against resumes. Here's how:&lt;/p&gt;

&lt;p&gt;// Extract keywords from job description&lt;br&gt;
function extractKeywords(text) {&lt;br&gt;
  // Remove common words&lt;br&gt;
  const stopWords = new Set(['the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for']);&lt;/p&gt;

&lt;p&gt;// Tokenize and clean&lt;br&gt;
  const words = text.toLowerCase()&lt;br&gt;
    .replace(/[^\w\s]/g, '')&lt;br&gt;
    .split(/\s+/)&lt;br&gt;
    .filter(word =&amp;gt; word.length &amp;gt; 2 &amp;amp;&amp;amp; !stopWords.has(word));&lt;/p&gt;

&lt;p&gt;// Count frequency&lt;br&gt;
  const frequency = {};&lt;br&gt;
  words.forEach(word =&amp;gt; {&lt;br&gt;
    frequency[word] = (frequency[word] || 0) + 1;&lt;br&gt;
  });&lt;/p&gt;

&lt;p&gt;// Return top keywords&lt;br&gt;
  return Object.entries(frequency)&lt;br&gt;
    .sort((a, b) =&amp;gt; b[1] - a[1])&lt;br&gt;
    .slice(0, 30)&lt;br&gt;
    .map(([word, count]) =&amp;gt; ({ word, count }));&lt;br&gt;
}&lt;br&gt;
Match Score Calculation&lt;br&gt;
The match score isn't just about presence—it's about relevance and frequency:&lt;/p&gt;

&lt;p&gt;function calculateMatchScore(resume, jobKeywords) {&lt;br&gt;
  const resumeLower = resume.toLowerCase();&lt;br&gt;
  let score = 0;&lt;br&gt;
  let maxScore = 0;&lt;/p&gt;

&lt;p&gt;for (const { word, count } of jobKeywords) {&lt;br&gt;
    maxScore += count;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Count occurrences in resume
const regex = new RegExp(word, 'gi');
const matches = resumeLower.match(regex);
const resumeCount = matches ? matches.length : 0;

// Reward presence, penalize absence
if (resumeCount &amp;gt; 0) {
  // Bonus for matching or exceeding expected frequency
  score += Math.min(resumeCount, count);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;return Math.round((score / maxScore) * 100);&lt;br&gt;
}&lt;br&gt;
Why Cloudflare Workers?&lt;br&gt;
I chose Cloudflare Workers for a few reasons:&lt;/p&gt;

&lt;p&gt;No cold starts — Unlike Lambda, Workers are always warm&lt;br&gt;
Global edge deployment — 300ms latency from anywhere&lt;br&gt;
Generous free tier — 100,000 requests/day&lt;br&gt;
No database needed — All processing is stateless&lt;br&gt;
The entire app fits in a single Worker, which keeps costs at literally $0 for normal usage.&lt;/p&gt;

&lt;p&gt;// worker.js - simplified routing&lt;br&gt;
export default {&lt;br&gt;
  async fetch(request, env) {&lt;br&gt;
    const url = new URL(request.url);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (url.pathname === '/api/scan') {
  return handleScan(request, env);
}

if (url.pathname === '/api/templates') {
  return handleTemplates(request);
}

return new Response(getHTML(), {
  headers: { 'content-type': 'text/html' }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
};&lt;br&gt;
Lessons Learned&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ATS Systems Are Dumber Than You Think
They're not looking for "magic keywords" in some secret algorithm. They're doing basic text matching with some synonym support. The "secret" is:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use exact phrases from the job description&lt;br&gt;
Don't overdo it (keyword stuffing triggers flags)&lt;br&gt;
Standard section headings (Experience, Education, Skills)&lt;br&gt;
Simple formatting (tables and columns confuse parsers)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Quantified Achievements Matter Most&lt;br&gt;
The scanner now specifically looks for numbers in achievements. "Increased sales" is weak. "Increased sales by 35% in Q4" is strong. ATS systems weight these higher.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Action Verbs Beat Passive Voice&lt;br&gt;
Weak: "Was responsible for managing a team" Strong: "Led a team of 8 engineers"&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The difference isn't just readability—it's how ATS systems score leadership potential.&lt;/p&gt;

&lt;p&gt;What's Next&lt;br&gt;
I'm working on:&lt;/p&gt;

&lt;p&gt;AI-powered rewriting — Let GPT suggest better phrasings for bullet points&lt;br&gt;
Cover letter generator — Match tone and keywords from job description&lt;br&gt;
Bulk analysis — Scan your resume against 10 jobs at once&lt;br&gt;
Browser extension — One-click scan from any job board&lt;br&gt;
Try It Yourself&lt;br&gt;
Head over to smart-resume-now.top and paste your resume + a job description. No signup required.&lt;/p&gt;

&lt;p&gt;I'd love feedback from the dev community. What features would actually help you in your job search? What did I miss?&lt;/p&gt;

&lt;p&gt;Built with ❤️ after watching too many talented friends get ghosted by ATS systems.&lt;/p&gt;

&lt;p&gt;P.S. If this helped you land an interview, I'd love to hear about it!&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%2Fmmne5o7iv7g0k5emcrkn.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%2Fmmne5o7iv7g0k5emcrkn.png" alt=" " width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>javascript</category>
      <category>python</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
