I built Resume Tailor over the past few weeks, and I want to share why and how.
The problem
I kept seeing the same pattern: someone has solid experience, but their resume doesn't match the job description. Not because they're unqualified — because the wording is off.
A product manager applying to a "Growth" role writes about "feature delivery" when the JD says "experimentation" and "funnel optimization". A software engineer writes "built microservices" when the JD wants "designed distributed systems". Same experience, different framing.
Manually rewriting this for every application is tedious. And most people don't do it, so they get filtered out before a human ever reads their resume.
What Resume Tailor does
You paste two things:
The job description
Your current resume
And you get four things back:
Tailored professional summary — rewritten to match the tone and priorities of the JD
Improved bullet points — your existing bullets reframed using the JD's language
Missing keywords — terms in the JD that don't appear anywhere in your resume
Improvement suggestions — specific, actionable notes on what to change
The one rule I refused to break
No fabrication.
It's tempting to let the AI invent achievements. "Increased revenue by 40%" sounds great, but if you didn't do it, it's a lie. Resume Tailor is explicitly designed to optimize framing, not facts.
The system prompt enforces this. If the AI starts inventing specifics that weren't in the original resume, that's a bug, not a feature.
Tech stack
Next.js 16 (App Router, Turbopack)
Cloudflare Workers via OpenNext adapter
Supabase for auth and database
Google OAuth for sign-in
OpenAI-compatible API for the LLM calls
Tailwind CSS v4
PayPal for payments
Deployed on Cloudflare Pages/Workers with GitHub Actions CI.
Interesting technical decisions
Streaming vs. single response
I went with a single response (no streaming) for the MVP. Streaming adds complexity and the output is structured JSON, which is harder to stream reliably. Speed is acceptable for now — typical generation is under 30 seconds.
Guest quota in localStorage
Guests get one free try, stored in localStorage. It's not tamper-proof and I know it. For an MVP trying to reduce friction before sign-in, it's the right tradeoff. Logged-in quotas are enforced server-side.
Hydration mismatch with locale
The app supports English and Chinese. The locale is read from ?lang= URL params. This caused a hydration mismatch because the server defaulted to English while the client switched to Chinese on first render.
The fix: the root layout reads the lang param server-side and passes initialLocale to the context provider, so SSR and CSR agree from the start.
What's next
Better handling of long resumes (chunking)
More output formats (cover letter, LinkedIn summary)
Usage analytics to understand which job categories people use it for most
Try it
https://resumetailor.website
No sign-in required for your first try. Would love feedback on the output quality — especially from anyone who's gone through an international job search or applied to roles in a second language.
For further actions, you may consider blocking this person and/or reporting abuse
Top comments (1)
The "no fabrication" constraint via system prompt is smart. Most AI writing tools let the model hallucinate impressive-sounding achievements, which completely undermines trust when it matters most (like a job application).
Interesting tech stack choice too — Next.js 16 + Cloudflare Workers + Supabase is becoming a really solid pattern for AI-powered SaaS MVPs. The single response vs. streaming decision makes total sense when your output is structured JSON. We made a similar call at AnveVoice when building our voice AI assistant — structured action outputs (DOM clicks, form fills, page navigation) need to be atomic, not streamed.
The guest quota in localStorage approach is pragmatic for MVP. Have you thought about adding voice-based interaction for the resume input? Users could describe their experience verbally and have AI structure it into bullet points. That's the direction we see a lot of web tools heading — from click-and-type to speak-and-done.