Skip to content

Case study / Resalad

One profile, a tailored resume for every job

A job application tracker that writes a resume and cover letter for each job description from one detailed profile, with every model output validated before it is stored.

Product designLLM integrationNext.js
Services
Design, Engineering, LLM integration
Stack
Next.js, PostgreSQL, pg-boss, Anthropic API
LLM jobs
Six kinds, one validated path

At a glance

Problem
A language model asked to tailor a resume can invent experience, and the job description it reads can carry instructions.
What we built
A profile-first product where every model call goes through one function that forces a tool call, validates the result and retries on failure.
Result
Resumes and cover letters are built only from validated model output, with names and contact details taken from the profile.
LLM job kinds, one validated call
6
Resume themes rendered on the server
3
Unreviewed repository text in a resume
0

The challenge

A model that invents experience, reading text written by strangers

Tailoring a resume to every posting is slow, and handing the work to a language model creates new problems.

A model will happily claim experience nobody has, and the job description it reads is text written by a stranger.

Resalad had to produce a resume and cover letter for each application from one detailed profile, without inventing anything and without letting a pasted posting steer the result.

A mock resume fills in beside the skills step as suggested skills are accepted or dismissed.

Our approach

Guided steps for people, one validated path for the model

We designed the product around one rich profile and short, guided steps, and sent every model call through a single function.

That function forces one tool call, validates the result against a strict schema and retries with the validation errors when it fails.

A setup wizard shows the resume taking shape as you answer, and the application flow asks one clarifying question at a time.

Job descriptions and repository files are sanitized and fenced in delimiters, repository summaries must be reviewed before they are saved, and names and contact details come from the profile, never from the model.

A repository summary is drafted in the background and confirmed in an editor before it is saved.
An output with a planted link fails validation; the corrected output becomes the resume PDF.

The outcome

Every model output validated before it is stored

Six kinds of model output share one validated path, and the documents sent with an application stay exactly as they were sent.

Gap analysis, resumes, cover letters, enrichment questions, skill suggestions and repository summaries all run in a background worker and are tested against a library of prompt-injection fixtures.

PDFs are rendered once on the server from validated JSON, and marking an application as applied freezes the documents that were sent.

Marking an application as applied freezes its resume and cover letter.
“Design and engineering in the same room means nothing gets lost in a handoff. It shows in the final product.”
Client Name/Founder

Have a project in mind?

Tell us what you’re working on, and we’ll follow up to find a time to talk.