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

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
Cisco Talos Blog
Cisco Talos Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
D
Docker
S
SegmentFault 最新的问题
博客园 - 聂微东
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
M
MIT News - Artificial intelligence
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
GbyAI
GbyAI
L
LangChain Blog
Vercel News
Vercel News
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
Engineering at Meta
Engineering at Meta
T
Threat Research - Cisco Blogs
T
Threatpost
Scott Helme
Scott Helme
T
Tailwind CSS Blog
Latest news
Latest news
Stack Overflow Blog
Stack Overflow Blog
Blog — PlanetScale
Blog — PlanetScale
The Register - Security
The Register - Security
罗磊的独立博客
P
Proofpoint News Feed
腾讯CDC
S
Schneier on Security
雷峰网
雷峰网
A
About on SuperTechFans
T
Tenable Blog
F
Full Disclosure
Cyberwarzone
Cyberwarzone
博客园_首页
有赞技术团队
有赞技术团队
K
Kaspersky official blog

DEV Community

🔮 Hermes Agent 🤖: A Practical Guide 🔥 — and How It Stacks Up Against OpenClaw & GoClaw 📊 CSS @function Agent Payment Stablecoin Fallbacks: Do Not Retry the Changed Quote Daily-summary-agent Opus 4.8 barely moved the leaderboard. It moved the one number that decides if your agents can be trusted. The best Claude Code agents are defined by what they refuse to do I Built a Tiny Skeleton Loader for React Why I Generated Synthetic Patients to Make Identity Matching Better SPIFFE Compliance Deep Dive PostgreSQL 08007 오류 원인과 해결 방법 완벽 가이드 I Was Tired of Writing Daily Standups, So I Built an AI Agent using claude code I got tired of LLM observability tools getting acquired. So I built one that can't be. Oracle ORA-00072 오류 원인과 해결 방법 완벽 가이드 Multi-Agent Negotiation Protocols: How AI Agents Should Bargain for Resources uBlock Origin No Longer Works on Chrome - Here Are the Best Alternatives in 2026 SSH Agent Forwarding vs ProxyJump: Why Agent Forwarding Is Dangerous and What to Use Instead The Best Technology Disappears I Built a Production-Oriented Multi-Provider AI Chatbot in Rust — Here's How Markov Chain Coin Sequence: E[HH] vs E[HTH] Explained LLM Deal Flow Automation in CRM The Do-Over Game: Nash Equilibrium at the Golden Ratio Cash Flow Waterfall Model for LBO Automated Client Reporting The Monty Hall Problem: Why Switching Wins 2/3 of the Time Chat With Your Database Using Natural Language: The Future of Business Analytics Google Apps Script Automation Amoeba Extinction Probability: The Branching Process Solution RAG Architecture Deep Dive Real-Time KPI Dashboards OpenAI Agents SDK的5个隐藏用法 🔥 Algorithmic Trading Pipelines 131 tokens per second on GPU under Kubernetes one of the best blogs about hermes agent Nous Research Hermes Agent: Setup and Tutorial Guide Day 20 - AWS Lambda Spending Hours Designing the UI? Or Just Telling AI the Pain Story Karpenter on AKS in 2026: What Actually Works I built a Chrome extension that shows your ChatGPT token usage in real-time Day 1 Field Report — Barriers to an Autonomous Agent Earning Money Online Mastering Background Processing in Rails 8: Sidekiq & Redis Optimization I shipped three fixes to my product in seven days. All three came from readers. Claude Code Model Switching: The Verification Notes That Could Save You $200/Month Three agent-memory threads this week, one missing field The Way to Break Through: Why Others Sail Through While You Struggle Simple Snap Layout Overlay for Tauri v2 CSS Animation vs Lottie: Which Should You Use in 2025? How to Add Lottie Animations to Vue.js (2025 Guide) Building BayouOps Suite Pro — Lightweight Operational Readiness & Visibility for IT Teams Detecting Adversary-in-the-Middle (T1557) with Data Science HTTP Headers Every Developer Should Know (2026) Detecting Ingress Tool Transfer (T1105) with Python Linux Command Line: The 25 Commands I Use Every Day (2026) Starting My Cybersecurity Learning Journey 🚀 CSS in 2026: Modern Techniques You Might Not Know (2026) TypeScript Deep Dive: Advanced Types and Patterns (2026) Three SQL Injection Patterns That Still Ship in Node.js — And the ESLint Rule That Catches Them From Idea to Production: How I Built a Decoupled Chatbot Ordering Engine I Spent 8 Months Building a Framer Killer as a Solo Undergrad. Here's What Happened. unknown 5 Git Commands I Wish I Knew 5 Years Ago How to Find users who don't follow you back in Github Bulk-check DNS, SSL and email auth for a whole list of domains (no scraping) Monolithic vs Microservices Architecture: Which One Should You Choose? The Full-Stack Developer's 2026 Playbook: 7 Shifts That Separate Senior Engineers from the Rest MCP Tool Budget for AI SaaS: Stop Agents From Burning Tokens, Tools, and Trust Untrusted Code, Trusted Cluster Scaling Secure AI Agent Workspaces with GKE Agent Sandbox Learning, Experimenting - Concurrency in Go Building Dhrishti Part 2: Go-Lang Quirks Announcing My New Book: Web Automation with Playwright and Python using AI and MCP Why MTP Batch Transfers Slow Down Between Files How We Cut Our AI Coding Bill by 65% Without Sacrificing Quality Claude vs Gemini Across 4 Security Domains: A Dead Heat — and the Hardening 63% of AI Code Skips I Benchmarked 4 Lightweight Transformers for Fault Detection. Here's What Survived. 🗡️ Tsundoku Slayer: An Agent That Decides What Not To Read Animated Icons for Web Apps — The Complete 2025 Guide How to Use Lottie Animations in React (2025 Guide) Azure API Management - Deploy gRPC API on Azure API management using self hosted gateway I Built pretext-pdf: Serverless PDFs Without Chromium Lottie JSON vs .lottie Format — What's the Difference and Which Should You Use? SVG Icon Systems in 2025 — Everything You Need to Know My Trading Bot Tried to Execute the Same Trade Twice. That Became SafeAgent. Free Loading Animations for Web Apps — Lottie, GIF, and SVG Spinners (2025) How to Add Lottie Animations to Your Website (Free JSON Files Included) Idempotency Keys: The One API Pattern That Prevents Duplicate Payments (and Worse) CONFIGURING SEMANTIC MODEL IN POWER BI Surviving Global Vendor Outages: Federated Cellular Architecture with EKS, AKS, and Istio I Turned My Cursor + Claude Code Setup Into 12 Reusable Files I Built a Cognitive Threat Hunter on Hermes Agent — It Analyzed the Session Where I Built It and Found Three Blind Spots Making AI-Generated Code Fail Gracefully How to Convert Lottie JSON to GIF (Free, Browser-Based, No Signup) Observability 2.0: Tracing AI "Thought Chains" with OpenTelemetry Best Free Lottie Animation Tools in 2025 (No Signup, No Paywall) What Is a Function in Scala Three ways to gate an MCP server: OAuth, L402, and proof-of-work You don't know kubectl — you know how to Google kubectl. The first-principles fix. Building a DevOps Incident Investigator with Coral SQL — From 15 Minutes to 15 Seconds When the Default Postgres Pool Died at 3 AM What Is Database Sharding — and When Does Your Startup Actually Need It Anti Refusal LLM Service A repeatable workflow for paper figures so you stop redrawing them every revision
I Built an AI Interview Coach That Turns Any Resume Into a Personalized Prep Package — No API Keys Needed
Ansuj Kumar Meher · 2026-05-31 · via DEV Community

This is a submission for the Hermes Agent Challenge

What I Built

Interview preparation is broken. You Google "top 50 interview questions," get a wall of generic prompts that have nothing to do with your background, and somehow you're supposed to feel prepared. If you've built real-time chat systems with Socket.io and trained CNNs with TensorFlow, why are you practicing questions about linked lists and nothing else?

I built AI Interview Coach — a full-stack web application that takes your resume PDF and produces a complete, personalized interview preparation package in under five seconds.

Here's what happens when you upload a resume:

  1. Resume Score (out of 10) — Your resume is scored across five dimensions: Formatting & Readability, Content Completeness, Skills Relevance, Experience Impact, and Education & Certs. Each dimension gets a score, a color-coded progress bar, and specific notes explaining the rating.

  2. Skills Summary — The engine auto-detects technologies from your resume and groups them into categories: Languages, Frameworks, ML & AI, Cloud & DevOps, Databases, and Tools & Practices. It scans against 90+ technology keywords.

  3. 20 Technical Interview Questions — These are generated based on what's actually on your resume. If you list TensorFlow, you'll get questions about batch normalization and vanishing gradients. If you list React, you'll get questions about useEffect dependency arrays and virtualization. Each question includes a "why" explanation connecting it to something specific on your resume.

  4. 10 HR & Behavioral Questions — Adapted based on whether you're a student, have internship experience, show leadership signals, or have multiple projects. Each comes with a STAR-method framing tip.

  5. Improvement Suggestions — Prioritized into High, Medium, and Low buckets. Things like "Quantify your achievements" or "Add certifications" — not vague advice, but specific actions mapped to scoring gaps.

The entire thing runs locally. No OpenAI key. No GPT calls. No cost per request. No data leaves your machine.

Why does this matter? Because most interview prep tools either cost money, require API keys, or give you the same generic output regardless of your background. This one is free, private, and genuinely personalized.

Demo

📹 Video Walkthrough:


Upload Zone — Drag & drop your resume PDF:
Drag & drop your resume PDF

Resume Score — Circular indicator + five-dimension breakdown:

Resume Score

Skills Summary — Auto-detected technologies grouped by category:

Skills Summary

Technical Questions — Searchable, filterable, with difficulty badges:

Technical Questions

HR Questions — Category-tagged with STAR-method tips:

HR Questions

Improvement Suggestions — Prioritized by impact:

Improvement Suggestions

Analysis engine output — scores, skills, and tailored questions in the terminal:

Code

AI Interview Coach

A full-stack web application that analyzes resumes and generates personalized interview preparation packages. Built with React + Express for the Hermes Agent Challenge.

Overview

Upload a resume PDF and instantly receive:

  • Resume Score — rated across 5 dimensions (formatting, completeness, skills relevance, experience impact, education)
  • Skills Summary — auto-detected and grouped by category
  • 20 Technical Interview Questions — tailored to your actual skills and projects
  • 10 HR / Behavioral Questions — with STAR-method framing tips
  • Improvement Suggestions — prioritized by impact

No API keys or external services required. Everything runs locally.

Architecture

interview-coach-app/
├── backend/
│   ├── server.js              # Express server — upload handling, analysis engine
│   ├── package.json           # Dependencies: express, multer, cors
│   └── tmp/                   # Temp directory for PDF processing
├── frontend/
│   ├── src/
│   │   ├── App.jsx            # Main app — theme toggle, upload, results orchestration
│   │   ├── main.jsx           # React

My Tech Stack

Frontend:

  • React 18 — Functional components with hooks (useState, useRef, useCallback). Five purpose-built components: FileUpload, ResumeScore, SkillsSummary, QuestionsList, and Suggestions.
  • Vite 5 — Dev server with API proxy to the backend, plus production builds served directly by Express.
  • CSS Custom Properties — A complete dark and light theme system with 25+ CSS variables. No Tailwind, no CSS framework — every style is hand-written with transitions for smooth theme switching.

Backend:

  • Node.js + Express 4 — Handles file uploads via Multer (disk storage, PDF-only filter, 10MB limit), spawns the Python extraction process, runs the analysis engine, and serves the built frontend in production.
  • Custom request logger — Every request gets a unique ID and timing for debugging.

PDF Extraction:

  • Python 3 + pymupdf — Extracts raw text from PDF resumes with proper Unicode handling. The script outputs structured JSON including page-level text, page count, and document metadata.

Analysis Engine:

  • A custom rule-based engine written entirely in JavaScript — no external API calls. It includes:
    • A multi-dimensional scoring system with regex-based pattern matching
    • Skill extraction across 90+ technology keywords organized into 6 categories
    • Conditional question generation with 30+ templates spanning Deep Learning, NLP, Computer Vision, React, Node.js, Databases, Cloud, Security, and more
    • HR question adaptation based on inferred career stage
    • Priority-ranked improvement suggestions mapped to scoring gaps

Build & Dev Tooling:

  • Vite for frontend bundling
  • Express serves the production build from frontend/dist/
  • uv for Python virtual environment and dependency management

How I Used Hermes Agent

Hermes Agent was involved at every stage of building this project — not as a magic "generate my app" button, but as a collaborative development partner that I could iterate with in real time.

Hermes Agent CLI

Architecture Decisions

The first thing I worked through with Hermes was the fundamental architecture question: should the analysis engine call an external LLM, or should it be rule-based?

Hermes helped me reason through the tradeoffs. An LLM-based approach would generate more varied questions, but it would require API keys (friction for users), add latency (seconds per request), introduce cost (real money per upload), and make the output non-deterministic. Hermes helped me design a rule-based engine that's fast, free, deterministic, and transparent. Every score has an explanation. Every question has a "why."

Hermes also helped me decide on the three-layer architecture — React frontend, Express backend, Python extraction subprocess. The alternative was doing PDF extraction in Node.js, but Hermes pointed out that pymupdf has significantly better handling of ligatures, embedded fonts, and Unicode edge cases compared to the Node.js PDF libraries available.

Here's Hermes planning the approach and setting up the Python environment:

Architecture Decisions

Implementation: The Analysis Engine

Hermes scaffolded all 16 source files, installed dependencies, and verified the frontend build — all in a single session:

Implementation: The Analysis Engine

The heart of the application is the analyzeResume() function in server.js — around 300 lines of scoring, extraction, and question generation logic. Hermes helped me build this incrementally.

For the scoring system, I started with a basic keyword count approach, but Hermes helped me evolve it into a five-dimension model. Take the Experience Impact dimension:

let impact = 3;
if (/\d+%/.test(text)) impact += 2;
if (/\d+\+ (users|requests|events|bugs|projects|modules)/i.test(text)) impact += 1.5;
if (/reduced|improved|increased|optimized|accelerated/i.test(text)) impact += 1.5;
if (/led|owned|driven|spearheaded|initiated/i.test(text)) impact += 1;
if (/\d+K\+|\d+M\+|\d+TB|\$[\d,]+/i.test(text)) impact += 1;
impact = Math.min(Math.round(impact), 10);

Enter fullscreen mode Exit fullscreen mode

Hermes helped me identify which regex patterns actually correlate with strong resumes — looking for quantified achievements, scale indicators, and action verbs that signal ownership. We iterated on the weights until the scores felt calibrated against real resumes.

For question generation, Hermes helped me design the conditional template system. Instead of random questions, each template is gated on what's actually in the resume:

if (has(["tensorflow","keras"])) {
  add("Deep Learning", "Hard",
    "You used transfer learning with MobileNetV2. Explain why you'd freeze early layers vs fine-tune them all.",
    "Your EarthSense-AI project used transfer learning — interviewers will probe the reasoning.");
}

Enter fullscreen mode Exit fullscreen mode

This produces questions that reference the user's actual projects and explain why an interviewer would ask this. Hermes helped me write templates for 15+ technology areas.

Debugging: The Unicode Incident

The first real-world resume I uploaded crashed the app. The error:

UnicodeEncodeError: 'charmap' codec can't encode character '\ufb01'

Enter fullscreen mode Exit fullscreen mode

That's the "fi" ligature — common in PDFs generated by LaTeX. On Windows, Python's default stdout uses cp1252 encoding, which doesn't support it.

Hermes immediately identified the root cause and proposed a two-layer fix. On the Node.js side, force the spawned Python process to use UTF-8:

const proc = spawn(pythonExe, [scriptPath, pdfPath, "--json"], {
  env: { ...process.env, PYTHONIOENCODING: "utf-8" },
});

Enter fullscreen mode Exit fullscreen mode

On the Python side, wrap stdout if the console encoding isn't UTF-8:

if sys.stdout.encoding.casefold() != "utf-8":
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")

Enter fullscreen mode Exit fullscreen mode

This fixed the crash without losing any text content. Hermes knew exactly where to intervene because it understood both the Node.js child process API and Python's encoding stack.

Feature Refinement

Hermes drove several UX improvements that I wouldn't have prioritized on my own. Here's Hermes refactoring the FileUpload component to add progress tracking and cancel support — you can see the diff of what changed:

Feature Refinement

  • Duplicate detection — When multiple skill categories triggered similar questions, Hermes suggested the deduplication step with normalized comparison, then padding with fallback questions to guarantee exactly 20 technical and 10 HR.
  • AbortController integration — Hermes wired up the upload cancel button to actually abort the in-flight fetch request and clean up state, rather than just hiding the progress bar.
  • Export formatting — The "Download Report" feature generates a structured text file with headers, scores, and all questions. Hermes helped format the output so it reads well in any text editor.
  • CSS custom properties for theming — Instead of class-based theme switching, Hermes designed a CSS variable system with 25+ tokens that made adding the light theme a one-block-of-CSS addition rather than rewriting every component.

Development Velocity

Working with Hermes, I went from an empty directory to a functioning full-stack app in a single development session. The agent handled the scaffolding — Vite config, Express boilerplate, Multer setup — while I focused on the analysis logic and UI design decisions.

After writing the files, Hermes automatically verified the build and ran syntax checks before moving on:

Hermes build verification

When I hit the Unicode bug, Hermes fixed it in minutes rather than the hour I'd have spent reading Python encoding documentation. When I wanted to add search and filtering to the questions list, Hermes built the entire QuestionsList component with search, difficulty filter, topic filter, copy-per-question, and copy-all in one pass.

That's the real value: Hermes doesn't replace thinking, but it removes the friction between having an idea and seeing it work.

Technical Challenges

PDF Extraction Is Messier Than You Think

PDF is a page layout format, not a document format. Text inside a PDF can be fragmented across drawing commands, use arbitrary fonts with custom ligature tables, and contain Unicode characters that look normal on screen but break when piped through a process boundary. The "fi" ligature is just the most common offender — there are dozens more in PDFs generated by professional typesetting tools.

The fix required interventions at two layers: the Node.js process spawner (setting PYTHONIOENCODING) and the Python script itself (wrapping sys.stdout). A single-layer fix wouldn't have been robust.

Deduplication Without Losing Personality

When a resume lists React, Node.js, and TypeScript, the question generator might fire templates from the "React" bucket, the "Backend" bucket, and the "TypeScript" bucket — some of which produce overlapping questions. Simple string deduplication would miss near-duplicates, so I normalize the text (lowercase, collapse whitespace) before comparison:

function deduplicateQuestions(questions) {
  const seen = new Set();
  const result = [];
  for (const q of questions) {
    const key = q.question.trim().toLowerCase().replace(/\s+/g, " ");
    if (!seen.has(key)) {
      seen.add(key);
      result.push(q);
    }
  }
  return result;
}

Enter fullscreen mode Exit fullscreen mode

After deduplication, I pad with fallback questions to guarantee the target count. The fallbacks are intentionally generic ("Describe a challenging bug you encountered") so they never feel redundant with the skill-specific ones.

Making a Rule-Based Engine Feel Intelligent

The hardest design challenge wasn't technical — it was making a rule-based system produce output that feels genuinely tailored rather than randomly selected. Three things made the difference:

  1. Every question explains why it's being asked — "You have TensorFlow and Keras on your resume" or "Your EarthSense-AI project used transfer learning — interviewers will probe the reasoning." This transparency makes the output feel personalized even though it's template-driven.

  2. HR questions adapt to career stage — The engine checks whether the text matches student patterns, internship signals, leadership keywords, or project count — and selects different question variants accordingly.

  3. Suggestions map to scoring gaps — If the Experience Impact score is low, the suggestion to "Quantify your achievements" appears in the High Priority bucket. The suggestions aren't random — they're tied to the dimensions that scored weakest.

Frontend UX: Small Touches, Big Difference

  • Collapsible sections — Let you focus on what matters. When you're practicing technical questions, you don't need the suggestions panel open.
  • Search and filter on questions — Type a keyword, filter by difficulty (Easy, Medium, Hard), filter by topic (React, Databases, Security). The filter count updates in real time.
  • Copy to clipboard — Per question or all at once, useful for pasting into a study doc or sharing with a friend.
  • Progress simulation — The progress bar advances in random increments during the server round-trip, creating the feel of active processing rather than a dead spinner.

Lessons Learned

  1. Rule-based doesn't mean dumb — A well-designed rule engine with good templates produces output that's consistent, explainable, and free. For structured tasks like scoring and question generation, you don't always need an LLM.

  2. Cross-process encoding is a minefield — Node.js spawning Python on Windows has encoding assumptions at every layer: the child process environment, Python's stdout wrapper, and Node's buffer-to-string decoding. You need to control all of them.

  3. Frontend polish is what separates a demo from a tool — Search, filter, copy, download, dark mode, collapsible sections — none of these are technically hard, but together they make the difference between "interesting prototype" and "I'd actually use this."

  4. Error messages are user experience — Every error in this app tells you what went wrong and what to do: "Only PDF files are allowed," "File too large (max 10 MB)," "Could not extract meaningful text — it may be image-based." No stack traces in the browser.

Future Improvements

  • LLM-powered question generation — Integrate an optional local LLM (via Ollama or similar) to generate more varied, context-aware questions while keeping the API-free default.
  • Answer scaffolding — For each question, generate a starter answer outline based on the resume content.
  • Job description matching — Upload a job description alongside your resume and get a gap analysis: skills you have vs. skills they want, plus targeted questions for the gaps.
  • PDF report export — Generate a formatted PDF report instead of plain text, with the score visualization and color-coded question cards.
  • Session history — Save past analyses to localStorage so you can track how your resume improves over time.
  • ATS keyword checker — Compare your resume against common ATS keyword databases for specific job titles.

Conclusion

AI Interview Coach is a focused tool that solves a real problem: turning a generic resume PDF into a personalized interview preparation package — with scoring, skill extraction, tailored questions, and prioritized improvement suggestions. It runs entirely locally, requires no API keys, and produces results in seconds.

Hermes Agent was instrumental throughout development. It helped me make the right architecture decisions (rule-based over LLM, Python for PDF extraction), built the analysis engine incrementally with proper scoring weights and conditional templates, solved the cross-platform Unicode encoding bug in minutes, and drove UX refinements like deduplication, abort handling, and the CSS theming system. The collaboration wasn't about generating boilerplate — it was about making better design decisions faster and shipping a more polished product than I would have built alone.

The project is open source under MIT. Upload your resume and see what comes back — I'd love to hear whether the questions actually match your background.