<?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: ADAM</title>
    <description>The latest articles on DEV Community by ADAM (@adamxanderson).</description>
    <link>https://dev.to/adamxanderson</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%2F3876524%2Fa8f09206-4304-4b8d-b200-25bd1b4b15a4.webp</url>
      <title>DEV Community: ADAM</title>
      <link>https://dev.to/adamxanderson</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adamxanderson"/>
    <language>en</language>
    <item>
      <title>The Zombie in My Room Inspired Me to Build an AI Recruitment Tool</title>
      <dc:creator>ADAM</dc:creator>
      <pubDate>Mon, 13 Apr 2026 18:04:25 +0000</pubDate>
      <link>https://dev.to/adamxanderson/the-zombie-in-my-room-inspired-me-to-build-an-ai-recruitment-tool-4a0k</link>
      <guid>https://dev.to/adamxanderson/the-zombie-in-my-room-inspired-me-to-build-an-ai-recruitment-tool-4a0k</guid>
      <description>&lt;h2&gt;
  
  
  My roommate looked like a zombie
&lt;/h2&gt;

&lt;p&gt;Not the scary kind. The kind that walks around with empty eyes, a coffee in hand and hasn't slept more than 4 hours in weeks.&lt;/p&gt;

&lt;p&gt;He was an HR professional. And every single night, I'd watch him hunched over his laptop, manually reading through hundreds of CVs. Highlighting. Comparing. Copy-pasting into spreadsheets. Sometimes until 3AM.&lt;/p&gt;

&lt;p&gt;One night I finally asked: &lt;em&gt;"Is there no tool for this?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;He laughed the tired kind. "There are, but they're either too expensive, too generic or just glorified keyword matchers. None of them actually &lt;em&gt;read&lt;/em&gt; the CV."&lt;/p&gt;

&lt;p&gt;That answer haunted me for weeks. Then I started building.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with "AI" Recruitment Tools
&lt;/h2&gt;

&lt;p&gt;Most ATS (Applicant Tracking Systems) that claim to use AI are doing one thing:&lt;br&gt;
&lt;strong&gt;keyword matching&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They scan for words like "Python" or "5 years experience" and rank candidates based on how many boxes they tick. Which sounds fine until you realize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A great candidate who wrote "half a decade of Python" gets ranked lower than someone who keyword-stuffed their CV&lt;/li&gt;
&lt;li&gt;Context is completely ignored. "Used Python once in college" and "Led a 10-person Python backend team" look the same to a keyword matcher&lt;/li&gt;
&lt;li&gt;HR still ends up reading every CV anyway, just with a worse list order&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My roommate wasn't wrong. The tools were broken.&lt;/p&gt;




&lt;h2&gt;
  
  
  So I Built TalentFlow
&lt;/h2&gt;

&lt;p&gt;TalentFlow is an end-to-end AI recruitment platform. Not just a CV screener the full flow:&lt;br&gt;
screening, pipeline management, interview scheduling, offer letters with digital signatures and an employee database.&lt;/p&gt;

&lt;p&gt;But the heart of it is the AI screening engine. And the key decision I made early:&lt;br&gt;
&lt;strong&gt;use a real LLM, not keyword matching&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of looking for words, the AI actually &lt;em&gt;reads&lt;/em&gt; the CV. It understands that a "System Administrator" is relevant for a "Network Engineer" role. It knows that "led a team" implies seniority. It can tell the difference between someone who &lt;em&gt;used&lt;/em&gt; a tool and someone who &lt;em&gt;built systems with&lt;/em&gt; that tool.&lt;/p&gt;

&lt;p&gt;The result: a 0–100 score per candidate, with full reasoning that HR can actually read and trust.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works (Without Giving Away the Secret Sauce)
&lt;/h2&gt;

&lt;p&gt;I'm keeping the implementation details close to the chest, but here's the general flow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. HR defines criteria&lt;/strong&gt;&lt;br&gt;
Not job descriptions specific, weighted criteria. Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Minimum Undergraduate Degree, preferably Computer Science or related field"&lt;/li&gt;
&lt;li&gt;"At least 3 years backend experience"&lt;/li&gt;
&lt;li&gt;"Has worked in a fintech or startup environment"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Upload CVs in bulk&lt;/strong&gt;&lt;br&gt;
Hundreds at once. The system parses the PDFs, extracts structured data (education, experience, skills, certifications), and deduplicates repeated sections automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. LLM evaluates each CV against the criteria&lt;/strong&gt;&lt;br&gt;
This is where the magic happens. The LLM doesn't just look for keywords it assesses relevance contextually. Is this person's background actually relevant to what you need? It explains its reasoning for every criteria point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Deterministic scoring layer&lt;/strong&gt;&lt;br&gt;
Here's something I'm actually proud of: the final score isn't purely AI-generated. After the LLM extracts and assesses facts, a deterministic scoring engine calculates the actual 0–100 score using clear rules. Education level comparisons, years of experience math, certification&lt;br&gt;
counts these are calculated precisely, not "guessed" by AI.&lt;/p&gt;

&lt;p&gt;This separation matters. AI handles what AI is good at (understanding context, reading nuance). Code handles what code is good at (math, consistency, reproducibility).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Pipeline, interviews, offers&lt;/strong&gt;&lt;br&gt;
Candidates move through a visual pipeline. HR can take notes, send interview invitations via email, generate offer letters from PDF templates, collect candidate signatures digitally, and move them to an employee database all without leaving the platform.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Org System: Built for Real HR Teams
&lt;/h2&gt;

&lt;p&gt;One thing I learned from my roommate: HR is never one person.&lt;/p&gt;

&lt;p&gt;So TalentFlow has a full organization system. Teams share a workspace same pipeline, same candidate data, same screening results. Credits (for AI screening) are shared across the org. Invite teammates with a code, and they're in.&lt;/p&gt;

&lt;p&gt;When someone leaves the org, their personal credit balance is restored. No data gets mixed up.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Underestimated PDF parsing complexity.&lt;/strong&gt;&lt;br&gt;
CVs are a mess. Tables, columns, weird formatting, image-based PDFs. I spent way more time on the parser than I expected. The deduplication logic alone making sure the same experience section doesn't appear twice after parsing took multiple iterations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start with multi-tenancy in mind from day one.&lt;/strong&gt;&lt;br&gt;
I added the organization system later, which meant going back and scoping every single database query. Lesson learned: if your product will ever be used by teams, design for teams from the start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLM costs add up fast.&lt;/strong&gt;&lt;br&gt;
Processing hundreds of CVs in parallel is genuinely fast but it costs money per token. That's why TalentFlow uses a credit system. Users buy credits, each screening costs 1 credit. Transparent, predictable, no surprise bills.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Thing That Made It Real
&lt;/h2&gt;

&lt;p&gt;A few weeks after I launched a beta, I sent the link to my old roommate.&lt;/p&gt;

&lt;p&gt;He replied the next morning:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I processed 300 CVs last night in 45 minutes. I slept at 11."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That was enough.&lt;/p&gt;




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

&lt;p&gt;TalentFlow is live at &lt;strong&gt;&lt;a href="https://talentflow.debuggo.id" rel="noopener noreferrer"&gt;talentflow.debuggo.id&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;100 free credits when you sign up. No credit card required.&lt;/p&gt;

&lt;p&gt;If you're building something in the HR tech space, or just curious about how LLMs can be applied beyond chatbots I'd love to hear your thoughts in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with LLM + JavaScript. Deployed and maintained by one person.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Questions about the architecture? Drop them below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>hr</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>REST API vs GraphQL vs gRPC - Which One Should You Actually Use?</title>
      <dc:creator>ADAM</dc:creator>
      <pubDate>Mon, 13 Apr 2026 12:02:48 +0000</pubDate>
      <link>https://dev.to/adamxanderson/rest-api-vs-graphql-vs-grpc-which-one-should-you-actually-use-1f0m</link>
      <guid>https://dev.to/adamxanderson/rest-api-vs-graphql-vs-grpc-which-one-should-you-actually-use-1f0m</guid>
      <description>&lt;p&gt;Every backend developer hits this question eventually.&lt;/p&gt;

&lt;p&gt;You're starting a new project and someone in the team says &lt;em&gt;"let's use GraphQL"&lt;/em&gt; while another insists &lt;em&gt;"just REST, keep it simple."&lt;/em&gt; Meanwhile the senior dev quietly suggests gRPC and half the room goes silent.&lt;/p&gt;

&lt;p&gt;Let's break it down.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Short Answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;REST&lt;/strong&gt; : simple, universal, works everywhere&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GraphQL&lt;/strong&gt; : flexible, client controls the data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gRPC&lt;/strong&gt; : fast, strict contract, built for microservices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the longer one.&lt;/p&gt;




&lt;h2&gt;
  
  
  REST API
&lt;/h2&gt;

&lt;p&gt;Uses standard HTTP methods. You've seen this a thousand times:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET    /users      → fetch all users
POST   /users      → create a user
PUT    /users/1    → update user
DELETE /users/1    → delete user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; over-fetching and under-fetching. You either get too much data or you need 3 requests to get what you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it when:&lt;/strong&gt; public APIs, simple CRUD, small teams, fast delivery.&lt;/p&gt;




&lt;h2&gt;
  
  
  GraphQL
&lt;/h2&gt;

&lt;p&gt;One endpoint. The client asks for exactly what it needs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No wasted data. The server returns exactly that shape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; caching is harder, N+1 queries if you're not careful, overkill for simple apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it when:&lt;/strong&gt; multiple clients (web + mobile) needing different data shapes, complex relational data.&lt;/p&gt;




&lt;h2&gt;
  
  
  gRPC
&lt;/h2&gt;

&lt;p&gt;Built by Google. Uses Protocol Buffers instead of JSON binary format, much faster.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight protobuf"&gt;&lt;code&gt;&lt;span class="kd"&gt;service&lt;/span&gt; &lt;span class="n"&gt;UserService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;rpc&lt;/span&gt; &lt;span class="n"&gt;GetUser&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UserRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UserResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Strict contract. Both sides must agree on the schema. Auto-generates client code in&lt;br&gt;
multiple languages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; not human-readable, limited browser support, high learning curve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it when:&lt;/strong&gt; microservices talking to each other internally, high-throughput systems, streaming.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;REST&lt;/th&gt;
&lt;th&gt;GraphQL&lt;/th&gt;
&lt;th&gt;gRPC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Protocol&lt;/td&gt;
&lt;td&gt;HTTP/1.1&lt;/td&gt;
&lt;td&gt;HTTP/1.1&lt;/td&gt;
&lt;td&gt;HTTP/2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;Protobuf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexibility&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning curve&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Real World Answer
&lt;/h2&gt;

&lt;p&gt;Most production systems &lt;strong&gt;mix all three&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;REST&lt;/strong&gt; → public-facing APIs, third-party integrations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GraphQL&lt;/strong&gt; → main client-server communication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gRPC&lt;/strong&gt; → internal service-to-service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't pick one forever. You pick the right tool for the right layer.&lt;/p&gt;




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

&lt;p&gt;Understanding &lt;em&gt;why&lt;/em&gt; you choose a technology matters more than choosing the "right" one.&lt;/p&gt;

&lt;p&gt;That's what separates junior from senior.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;📖 &lt;strong&gt;Want the full deep-dive?&lt;/strong&gt; I wrote a more detailed version with code examples and real-world use cases over on DebugGo.id:&lt;br&gt;
&lt;a href="https://debuggo.id/blog/rest-api-vs-graphql-vs-grpc-mana-yang-harus-dipakai" rel="noopener noreferrer"&gt;REST API vs GraphQL vs gRPC - Which One Should You Actually Use?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;What's your stack using right now? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>graphql</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
