ResumeTailor

A tool for tailoring resumes and LinkedIn profiles to a specific job description, with results streamed in real time.

AI Tool Manus → Antigravity → Amp + Cursor → Codex 5.3 → Vercel

The Problem

Job applications are a volume game, but generic materials lose to tailored ones. Applicant Tracking Systems score resumes against job descriptions using keyword matching before a human ever reads them. Even qualified candidates fail to frame their experience in terms of the specific problems a role is trying to solve. And most LinkedIn profiles aren't written to surface for the right recruiter searches.

Doing that by hand for every application takes too long, so the product compresses the research, rewriting, and optimization into one pass.

The Insight

Most of the work is comparing two documents: the job description and the candidate's materials. A model can pull out requirements, spot missing keywords, rewrite bullets toward the role, and draft LinkedIn positioning. Because the output follows a known structure, it can be boxed in with a schema instead of hoping for clean text.

The Solution

ResumeTailor is a single-page app where you paste a job description and your resume, then get back a full optimization dashboard. Rewritten bullets, ATS keyword analysis, LinkedIn copy, and a gap analysis stream into the UI in real time. No login, no onboarding. Just an input form and a results dashboard.

How It Works

  1. Step 01

    Paste the target role

    The user drops in the job description so the app can anchor the analysis to the actual role.

  2. Step 02

    Paste current materials

    The resume or LinkedIn copy becomes the second half of the comparison instead of asking for a long setup flow.

  3. Step 03

    Stream the analysis

    The app starts showing structured results while the rest of the output is still arriving.

  4. Step 04

    Copy what you need

    Users can immediately lift the rewritten bullets, keywords, and LinkedIn copy into the next application.

The Product

Architecture

Frontend

Next.js 16 with React 19, Tailwind CSS 4, and shadcn/ui, with a three-column dashboard that fills in progressively.

AI Layer

Vercel AI SDK v6 and streamObject send the input to GPT-5.2 and return a typed object that streams to the client.

Security

HMAC-signed session cookies, Upstash rate limiting, input escaping, and prompt injection defenses protect the public endpoint.

Deployment

Vercel handles deployment, while Upstash Redis covers distributed rate limiting with an in-memory local fallback.

What Goes In and What Comes Out

Inputs

What the user provides

  • A job description with the actual requirements and language from the target role
  • The user's current resume or LinkedIn copy in whatever state it's already in
Outputs

What the app returns

Rewritten bullets ATS keywords LinkedIn headlines About section Gap analysis Relevance scores

Build Process

ResumeTailor started with a plan in Manus, then Antigravity generated the first version of the frontend, API route, schemas, and component structure.

From there, I used Amp and Cursor to add the parts that matter in a public app: HMAC-signed session tokens, rate limiting, input escaping, prompt injection defenses, structured logging, and consistent error handling. I used Codex 5.3 for review passes focused on security and type safety.

The whole app is about 1,700 lines of custom code: three business components (InputForm, ResultsDashboard, ResultsSkeleton), one API route, and six infrastructure modules.

Key Design Decisions

  • Structured streaming over simple completion: Using streamObject means the model returns a typed JSON object that streams progressively. Users start reading job description insights within a few seconds while resume bullets and LinkedIn content continue rendering.
  • Schema-first design with Zod: Both input and output are defined as Zod schemas. The output schema constrains the AI's response, eliminating an entire class of runtime bugs from inconsistent model output.
  • Defense-in-depth security: Input escaping prevents structural injection, XML delimiter tags isolate user content, the schema constrains output shape, and the system prompt instructs the model to ignore embedded instructions.
  • No login required: Results stay in memory only. Nothing is stored. Session tokens exist only for rate limiting, not identity.
  • Skeleton loading that mirrors layout: The ResultsSkeleton component matches the exact structure of the results dashboard, giving users immediate spatial context for where content will appear.

Iterating on User Feedback

After the initial launch, real users surfaced friction that wasn't visible during development. Four updates shipped in direct response:

  • Scroll bars: The three-column results dashboard could overflow on smaller viewports. Adding styled scroll areas to each panel made long outputs navigable without breaking the layout.
  • Export options: Users wanted to take their results somewhere, whether that's a Google Doc, a recruiter email, or an ATS paste field. Copy-to-clipboard and export functionality turned ResumeTailor from a read-only dashboard into a workflow tool.
  • Loading screen: The original loading state was minimal. Users didn't know what to expect or how long it would take. The skeleton loading screen, with three columns mirroring the results layout and labeled sections, gave immediate spatial feedback and reduced perceived wait time.
  • Status bars: Progress indicators were added to show which sections of the analysis had completed streaming. Users could see the AI working through each section in sequence rather than staring at a blank screen.

Application Features

  • Job description analysis: Extracts explicit requirements, implicit focus areas, and the core business problems the role exists to solve.
  • Resume bullet rewriting: Each bullet gets a rewritten version optimized for the target role, a relevance score from 1 to 5, and a positioning note explaining the reasoning.
  • ATS keyword analysis: High-value keywords are extracted and checked against the resume. Each keyword shows a present/missing status with suggestions for natural incorporation.
  • LinkedIn content generation: Three headline variants plus a tailored About section, all ready to copy out.

Tech Stack

Next.js 16 React 19 TypeScript Tailwind CSS 4 Vercel AI SDK v6 OpenAI GPT-5.2 Zod v4 shadcn/ui Framer Motion Radix UI Upstash Redis Lucide Icons Vitest Vercel

What It Demonstrates

  • Structured streaming: Schema-validated output arrives progressively instead of forcing the user to wait for one giant final response.
  • Public AI app hardening: Rate limiting, signed sessions, and prompt-injection defenses are built in from the start.
  • Workflow compression: The product takes a repetitive job-seeker task and collapses it into one fast pass.
  • User feedback loop: Scroll areas, exports, and better loading states all came from watching how people actually used it.

Need an AI product or internal tool like this?

ResumeTailor is the kind of scoped tool I build when the job is clear and the first version needs to be useful fast.