<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/how-to-build-an-ai-r-sum-screening-tool-with-next-js-supabase-and-typesafe-jev-nqjo8ihii" -->

---
title: How to Build an AI Résumé Screening Tool with Next.js,...
description: A software agency built an internal AI-powered résumé screening tool using Next.js, Supabase, and a new model called Jev from TypeSafe AI, released in...
canonical: https://daily.dev/posts/how-to-build-an-ai-r-sum-screening-tool-with-next-js-supabase-and-typesafe-jev-nqjo8ihii
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: How to Build an AI Résumé Screening Tool with Next.js, Supabase, and TypeSafe Jev | daily.dev
og:description: A software agency built an internal AI-powered résumé screening tool using Next.js, Supabase, and a new model called Jev from TypeSafe AI, released in...
og:url: https://daily.dev/posts/how-to-build-an-ai-r-sum-screening-tool-with-next-js-supabase-and-typesafe-jev-nqjo8ihii
og:image: https://api.daily.dev/og/posts/NQJO8iHiI.png
og:image:alt: How to Build an AI Résumé Screening Tool with Next.js, Supabase, and TypeSafe Jev
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# How to Build an AI Résumé Screening Tool with Next.js, Supabase, and TypeSafe Jev

**[freeCodeCamp](https://daily.dev/sources/freecodecamp)** · 94 min read · 2 upvotes · 0 comments

## Summary

A software agency built an internal AI-powered résumé screening tool using Next.js, Supabase, and a new model called Jev from TypeSafe AI, released in September 2026. Unlike GPT or Claude, Jev doesn't generate text; it returns calibrated numeric probabilities for typed questions (score, noul, choice), which the authors argue solves the core problem with LLM-based screening: generated numbers aren't real probabilities and can't be meaningfully sorted. The piece walks through why keyword filters, black-box match scores, and free-text LLM assessments all failed, explains the theory behind calibrated discriminative models versus generative autoregressive LLMs, and details the architecture: PDF upload to Supabase Storage, text extraction via unpdf, optional name/email extraction via a small LLM through Vercel AI Gateway, and scoring via a single Jev API call. The composite score is always computed in application code from Jev's typed answers, never by the model itself, and confidence scores route low-confidence cases to human review. The build is done through nine Claude Code prompts governed by a CLAUDE.md constitution file, with the full code available in a GitHub repo.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.freecodecamp.org/news/build-an-ai-resume-screening-tool-with-next-js-supabase-and-typesafe-jev>

## Questions this post answers

### Why isn't a score generated by a regular LLM like GPT or Claude reliable for ranking candidates?

A generative LLM's score is just text that looks like a number, not a real measurement, because nothing in training ties the string '7' or '70%' to an actual calibrated probability. Sampling means the same résumé can score differently on repeat runs, and there's no shared scale between candidates, so two identical-looking scores may not mean the same thing, making sorted rankings effectively random noise.

_Anyone weighing LLM scoring against calibrated models can track this debate on daily.dev._

### What is TypeSafe's Jev model and how is it different from GPT or Claude for scoring tasks?

Jev, released by TypeSafe AI in September 2026, is a discriminative model that never generates text; it takes a state object and a set of typed questions (score, noul, or choice) and returns numeric answers with calibrated probabilities instead of paragraphs. It responds in 70-500ms, costs $0.042 per million input tokens with free output tokens, and is trained with RLCD (reinforcement learning for calibrated decisions) rather than RLHF or RLVR.

_Developers evaluating calibrated versus generative models for scoring pipelines can follow this on daily.dev._

### Why should the composite score in an AI screening tool be computed in application code instead of asking the model for a final number?

Computing the composite score in code keeps it auditable and instantly adjustable: TypeSafe's own documentation warns against using Jev's score outputs as exact values since levels are meant for thresholds, a weighted sum lets you show the exact formula behind any candidate's score, and changing weights only requires updating a coefficient and re-running scores in milliseconds rather than retraining or re-prompting a model.

_Teams designing auditable AI scoring pipelines can keep track of patterns like this on daily.dev._

---

Tags: [#ai-agents](https://daily.dev/tags/ai-agents), [#nextjs](https://daily.dev/tags/nextjs), [#supabase](https://daily.dev/tags/supabase)

[View this post on daily.dev](https://daily.dev/posts/how-to-build-an-ai-r-sum-screening-tool-with-next-js-supabase-and-typesafe-jev-nqjo8ihii)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"How to Build an AI Résumé Screening Tool with Next.js, Supabase, and TypeSafe Jev","url":"https://daily.dev/posts/how-to-build-an-ai-r-sum-screening-tool-with-next-js-supabase-and-typesafe-jev-nqjo8ihii","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/how-to-build-an-ai-r-sum-screening-tool-with-next-js-supabase-and-typesafe-jev-nqjo8ihii"},"datePublished":"2026-09-29T14:01:35.013Z","dateModified":"2026-09-29T19:41:42.712Z","description":"A software agency built an internal AI-powered résumé screening tool using Next.js, Supabase, and a new model called Jev from TypeSafe AI, released in...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/e78d4c741a7b23e18fd6d2925b229f32?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/e78d4c741a7b23e18fd6d2925b229f32?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"freeCodeCamp","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"freeCodeCamp","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1628412854/logos/freecodecamp","url":"https://daily.dev/sources/freecodecamp"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/how-to-build-an-ai-r-sum-screening-tool-with-next-js-supabase-and-typesafe-jev-nqjo8ihii","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":2},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"ai-agents,nextjs,supabase","timeRequired":"PT94M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"freeCodeCamp","item":"https://daily.dev/sources/freecodecamp"},{"@type":"ListItem","position":3,"name":"How to Build an AI Résumé Screening Tool with Next.js, Supabase, and TypeSafe Jev"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/how-to-build-an-ai-r-sum-screening-tool-with-next-js-supabase-and-typesafe-jev-nqjo8ihii#faq","mainEntity":[{"@type":"Question","name":"Why isn't a score generated by a regular LLM like GPT or Claude reliable for ranking candidates?","acceptedAnswer":{"@type":"Answer","text":"A generative LLM's score is just text that looks like a number, not a real measurement, because nothing in training ties the string '7' or '70%' to an actual calibrated probability. Sampling means the same résumé can score differently on repeat runs, and there's no shared scale between candidates, so two identical-looking scores may not mean the same thing, making sorted rankings effectively random noise. Anyone weighing LLM scoring against calibrated models can track this debate on daily.dev."}},{"@type":"Question","name":"What is TypeSafe's Jev model and how is it different from GPT or Claude for scoring tasks?","acceptedAnswer":{"@type":"Answer","text":"Jev, released by TypeSafe AI in September 2026, is a discriminative model that never generates text; it takes a state object and a set of typed questions (score, noul, or choice) and returns numeric answers with calibrated probabilities instead of paragraphs. It responds in 70-500ms, costs $0.042 per million input tokens with free output tokens, and is trained with RLCD (reinforcement learning for calibrated decisions) rather than RLHF or RLVR. Developers evaluating calibrated versus generative models for scoring pipelines can follow this on daily.dev."}},{"@type":"Question","name":"Why should the composite score in an AI screening tool be computed in application code instead of asking the model for a final number?","acceptedAnswer":{"@type":"Answer","text":"Computing the composite score in code keeps it auditable and instantly adjustable: TypeSafe's own documentation warns against using Jev's score outputs as exact values since levels are meant for thresholds, a weighted sum lets you show the exact formula behind any candidate's score, and changing weights only requires updating a coefficient and re-running scores in milliseconds rather than retraining or re-prompting a model. Teams designing auditable AI scoring pipelines can keep track of patterns like this on daily.dev."}}]}
```

