<?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: Christian Nnorom</title>
    <description>The latest articles on DEV Community by Christian Nnorom (@nnoromiv).</description>
    <link>https://dev.to/nnoromiv</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%2F3918414%2F4d423d11-6b82-47a8-bd37-d2ae7f0a791f.png</url>
      <title>DEV Community: Christian Nnorom</title>
      <link>https://dev.to/nnoromiv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nnoromiv"/>
    <language>en</language>
    <item>
      <title>I Built a Job Match Agent with Hermes Agent, And It Texts Me the Results on WhatsApp</title>
      <dc:creator>Christian Nnorom</dc:creator>
      <pubDate>Sat, 30 May 2026 12:46:06 +0000</pubDate>
      <link>https://dev.to/nnoromiv/i-built-a-job-match-agent-with-hermes-agent-and-it-texts-me-the-results-on-whatsapp-281o</link>
      <guid>https://dev.to/nnoromiv/i-built-a-job-match-agent-with-hermes-agent-and-it-texts-me-the-results-on-whatsapp-281o</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hermes-agent-2026-05-15"&gt;Hermes Agent Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;Job hunting is tedious. You find a posting, you open your CV, you squint at both for 20 minutes trying to figure out if you're actually a good fit, then you spend another hour writing a cover letter that probably sounds like every other cover letter.&lt;/p&gt;

&lt;p&gt;I'm a full-stack and AI engineer currently on the market. I thought: what if I could just send a job URL to my phone and get back a scored analysis and a tailored cover letter while I'm on the bus?&lt;/p&gt;

&lt;p&gt;That's what I built with Hermes Agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Job Match Agent&lt;/strong&gt; is a custom Hermes skill that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads your CV from a PDF&lt;/li&gt;
&lt;li&gt;Fetches a job description from a URL (or accepts pasted text)&lt;/li&gt;
&lt;li&gt;Scores your fit out of 100 with a detailed breakdown across four criteria&lt;/li&gt;
&lt;li&gt;Writes a tailored cover letter using your actual CV content and the job's own keywords&lt;/li&gt;
&lt;li&gt;Delivers everything back to you on WhatsApp&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole thing runs on my Windows machine. I talk to it from my phone. One message in, full analysis back.&lt;/p&gt;




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


&lt;div&gt;
    &lt;iframe src="https://www.youtube.com/embed/LVGX47-f39c"&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Flow:&lt;/strong&gt; Type "Job match this: [URL]" on WhatsApp → Hermes fetches the job, reads your CV, scores fit, writes cover letter → full response back on your phone in ~2 minutes.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;GitHub: &lt;a href="https://github.com/nnoromiv/job-match" rel="noopener noreferrer"&gt;hermes-job-match-agent&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  My Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hermes Agent&lt;/strong&gt; — orchestration, skill system, memory, WhatsApp bridge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.12&lt;/strong&gt; — core scripting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pdfplumber&lt;/strong&gt; — PDF CV extraction (pypdf fallback)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;httpx&lt;/strong&gt; — job URL fetching with browser User-Agent spoofing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;beautifulsoup4&lt;/strong&gt; — job description extraction with prioritised selectors for LinkedIn, Greenhouse, Lever, Workday&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp self-chat bridge&lt;/strong&gt; — built into Hermes Agent gateway&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Used Hermes Agent
&lt;/h2&gt;

&lt;p&gt;This is where it gets interesting. I didn't write a script that does these steps mechanically. I wrote a &lt;strong&gt;skill&lt;/strong&gt; a markdown file that teaches Hermes Agent what to do and Hermes handles all the planning and reasoning itself.&lt;/p&gt;

&lt;p&gt;When I send a job URL, here's what Hermes actually does autonomously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loads the &lt;code&gt;job-match&lt;/code&gt; skill from its skills directory&lt;/li&gt;
&lt;li&gt;Calls &lt;code&gt;read_cv.py&lt;/code&gt; to extract my CV text from the PDF on disk&lt;/li&gt;
&lt;li&gt;Calls &lt;code&gt;fetch_job.py&lt;/code&gt; to scrape the job description from the URL&lt;/li&gt;
&lt;li&gt;Reasons through a structured scoring rubric across four dimensions&lt;/li&gt;
&lt;li&gt;Writes a cover letter that mirrors the job's language naturally&lt;/li&gt;
&lt;li&gt;Sends the full response back over WhatsApp&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's real multi-step agentic behavior; &lt;strong&gt;planning, tool execution, reasoning, output&lt;/strong&gt;, not a hardcoded pipeline. Hermes decides the order of operations, handles failures gracefully, and formats the final response for WhatsApp automatically.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;memory system&lt;/strong&gt; is what makes the WhatsApp UX smooth. I told Hermes my CV path once:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Please remember my CV is always at: C:\Users...\Christian_Nnorom.pdf"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hermes saved it. Now from my phone I just send:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Job match this: [URL]"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No repeating myself. No attaching files. Hermes already knows.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&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%2Fc1v3q4oum3t8dd6e7qn2.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%2Fc1v3q4oum3t8dd6e7qn2.png" alt="Architectural diagram, explaining how the system functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two Python scripts are focused tools. All the intelligence the planning, scoring rubric, and cover letter logic, lives in the skill's instructions, which Hermes reads and follows.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Skill
&lt;/h2&gt;

&lt;p&gt;Hermes skills are markdown files with YAML frontmatter. No plugin registration, no framework boilerplate. Drop a &lt;code&gt;SKILL.md&lt;/code&gt; into the skills folder and Hermes picks it up automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;job-match&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyze&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;job&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;posting&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;against&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;CV/resume&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;fit,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;explain&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;reasoning,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generate&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tailored&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;cover&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;letter."&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Christian Nnorom&lt;/span&gt;
&lt;span class="na"&gt;platforms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;linux&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;macos&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;windows&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;hermes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Jobs&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Career&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;CV&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Resume&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Cover Letter&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Recruitment&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The skill defines the four-step workflow in plain English, with scoring criteria, output format templates, and fallback handling. Hermes reads this and executes it — including deciding when to run which script and how to handle edge cases like a URL that requires JavaScript rendering.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Results
&lt;/h2&gt;

&lt;p&gt;I tested it against two live job postings on the same day I built it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Role 1 — KTP Associate, AI &amp;amp; Computer Vision (UWE Bristol / Foster + Freeman)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Overall Score: 64/100

Required Skills: 20/40 — Strong ML/CV experience but no PhD (mandatory)
Experience Level: 12/20 — 3+ years industry experience, MSc distinction
Domain Match: 14/20 — Applied AI/CV work relevant, forensic context less so
Nice-to-haves: 18/20 — Docker, AWS, MLOps, full-stack all present

Verdict: Apply. Lead with production AI pipeline experience. Address the
PhD gap directly by highlighting MSc distinction and immediate readiness.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Role 2 — AI Platform Engineer, KTP Associate (Aston University / Modular Data Ltd)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Overall Score: 84/100

Required Skills: 32/40 — Strong match on cloud/microservices, MLOps, Python,
  ethical AI (SHAP/LIME). Gaps: knowledge graphs, Go/Java.
Experience Level: 18/20 — MSc Distinction + 3+ years production AI systems
Domain Match: 16/20 — Modular AI platform work aligns directly
Nice-to-haves: 18/20 — Open-source, AWS cert, multi-cloud, ethical AI all present

Verdict: Strong fit. Emphasise modular platform delivery and MLOps expertise.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two roles, two honest scores — 64 and 84. The agent called out the PhD gap on the first role rather than inflating the score. That's exactly what you want from a tool like this.&lt;/p&gt;

&lt;p&gt;Each analysis came with a full cover letter — 248 words, keywords matched from the job description, no generic openers.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;&lt;code&gt;read_cv.py&lt;/code&gt;&lt;/strong&gt; — tries &lt;code&gt;pdfplumber&lt;/code&gt; first, falls back to &lt;code&gt;pypdf&lt;/code&gt;, prints extracted text with a word/line count header. Fails loudly with actionable errors if extraction fails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;fetch_job.py&lt;/code&gt;&lt;/strong&gt; — uses &lt;code&gt;httpx&lt;/code&gt; with a real browser User-Agent, then &lt;code&gt;beautifulsoup4&lt;/code&gt; to extract the job container using a prioritised list of selectors covering LinkedIn, Greenhouse, Lever, Workday, and generic semantic tags. Falls back gracefully with instructions to paste text directly if the page requires JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;pdfplumber httpx beautifulsoup4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full code at: &lt;a href="https://github.com/nnoromiv/job-match" rel="noopener noreferrer"&gt;github.com/nnoromiv/job-match&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned About Hermes Agent
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Skills are surprisingly powerful.&lt;/strong&gt; Writing the workflow in markdown felt almost too simple, but it works because Hermes actually reads and follows the instructions rather than vaguely gesturing at them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The memory system is the difference between a demo and a real tool.&lt;/strong&gt; Storing the CV path once and never repeating it makes the WhatsApp UX feel like a product, not a hack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest agentic output requires honest prompting.&lt;/strong&gt; The scoring rubric explicitly says "be honest in the gap analysis a useful score requires accurate assessment." Without that, agents flatter. With it, you get a 64 that's actually useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPU&lt;/strong&gt; - Running hermes on a gpu to quicken process.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch mode&lt;/strong&gt; — analyse 10 jobs at once, ranked by fit score&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application tracker&lt;/strong&gt; — Hermes logs each analysis to its Kanban board automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interview prep&lt;/strong&gt; — after scoring, generate likely interview questions based on the gaps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The foundation is solid. Hermes Agent handles the orchestration; extending the skill is all it takes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://hermes-agent.nousresearch.com" rel="noopener noreferrer"&gt;Hermes Agent&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/nnoromiv/job-match" rel="noopener noreferrer"&gt;github.com/nnoromiv/job-match&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Copy the &lt;code&gt;job-match&lt;/code&gt; folder into your Hermes skills directory&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;pip install pdfplumber httpx beautifulsoup4&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tell Hermes your CV path once via memory&lt;/li&gt;
&lt;li&gt;Send any job URL and let it work&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Built in one day for the Hermes Agent Challenge. Running on a Windows VPS, reachable from WhatsApp.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hermesagentchallenge</category>
      <category>devchallenge</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
