How to build an AI resume and cover letter builder with v0
A cover letter written for the exact role, from the resume you already have, with no account and nothing stored. Generate the screens in v0, add the one route that holds your key and writes the letter, and deploy the whole thing to Vercel as a single project: forms, function and export together.
v0
$ Build a tool that takes a resume as a file or through a guided form, takes a job posting, writes a cover letter for that role through one server route holding my AI key, and exports the resume as a real PDF.
- Screens generated and adjusted
- Letter written through the route
- Ready for you to review
How an AI builder actually works
A tool that takes two documents, your current resume and a job posting, and creates a third: a cover letter written specifically for that role, alongside an updated resume. The AI model itself is only a small part of the process.
The standard version of these tools comes as a paid subscription. You create an account, paste your history, and pay every month to download files, often starting with a trial that quietly renews. In reality, these services just use basic, publicly available AI models wrapped in a clean template and locked behind a paywall.
A better approach puts you in control. You simply upload your resume (or fill it in step-by-step) and paste the job description. The tool matches your real experience against the company’s requirements, formats the letter correctly, and lets you download a clean, ready-to-use resume.
The hardest part isn’t writing the text, it’s handling the data correctly. Job postings are usually chaotic walls of text, and your final file must survive automated applicant-tracking systems (ATS). If a file isn’t formatted properly, hiring software reads it as a blank page. On top of that, employers immediately recognize generic AI writing, so the letter must be built around actual facts from the posting, not written in broad, vague statements.
The inputs are the hard part
Getting AI to write text is easy. The real challenge is cleanly reading your resume and the job post without losing or scrambling key details.
No need to store your data
A letter is generated once and downloaded. There is no need for accounts, passwords, or databases keeping your personal job history on someone else’s server indefinitely.
Software reads the document first
A human reviewer only sees your application after automated software parses it. The tool must export real, scannable text, not an image-based PDF that hiring software rejects as blank.
The people reading it
81%
of hiring managers have encountered candidate AI use during recruitment, most often in resumes and cover letters, from Resume Genius’s survey of 1,500 U.S. hiring managers in June 2026, published July 2026.
resumegenius.com · checked September 2026
The parts every AI resume and cover letter builder is built from
Six pieces, and the model is inside only one of them. The other five are the reason a builder is a product rather than a prompt.
Two ways in: upload or build
Some people arrive with a resume and want to get on with it. Others have a history and no document. The first path takes a plain-text file up to 5 MB and reads it as it is. The second walks through six sections, adding and removing entries as you go, and produces the same text the upload would have. Both end at the same job form, which is what lets one function serve both.
The job the letter is written against
Company, position, and the posting pasted in whole rather than summarised. The whole point of a tailored letter is that it names the requirements the posting actually lists, so the form asks for the text and caps it at 5,000 characters per field, which is enough for any posting a person would apply to and short enough that nobody pastes a company’s entire careers page.
Secure server-side prompting
The request to the model goes through a single server function, and the function holds the instructions: a proper business letter with the contact details at the top, the applicant’s real name taken from the resume, the experience that matches the posting, a professional tone, and the company and the key points marked in bold. Change the tone once, in the function, and every letter changes. Keep the key there and it never reaches a browser.
Resume designs from one set of fields
Seven layouts (a corporate classic, a two-column with a sidebar, one for tech, one for research, one for creative work, one for senior roles, one modern default) all draw from the same fields the builder collected, so the applicant changes their mind about the look without retyping a word. The design is chosen before the job is described, on the path that builds a resume.
ATS-friendly exports
The resume downloads as a PDF and as text. The letter downloads as text and copies to the clipboard with one click, which for a letter is what people do with it: paste it into the application form. There is no PDF of the letter, and the resume PDF as shipped is an image of the design rather than a document with text in it, which step 05 of every page fixes.
Rate limiting & cost protection
A function anyone can call is a function anyone can call a thousand times. The template refuses oversized input, allows ten requests a minute from one address, and sends a header naming the one site allowed to call it, which browsers respect and scripts do not. None of that is a substitute for a spending limit at the provider, which is the one cap that bounds what a bad night can cost you, and the security section below says where to set it.
Own the builder or rent it by the month
Most people who use a cover letter builder this year will subscribe to one, and for a single application that is a reasonable thing to do. What is worth looking at is what the subscription actually meters, and how far the same letter costs at the price of the model itself.
Build your own
A builder you own is one build, one function, and one provider account with a spending limit on it. Nothing counts your letters and nothing keeps your history, and with an AI coding tool writing it the build is a week or two rather than a quarter.
- No monthly fee, no trial that renews, and no count of letters or downloads
- A letter costs what the model charges for its tokens, which at list prices is a fraction of a cent
- The resume and the posting stay in the browser and travel once, to the model, through a function you control
- Put your own name on it and hand it to a client, a cohort of students, or a whole careers service at no extra cost per person
- Change the tone, the letter format, or the model in one place, because the prompt is yours
- Full ownership: export it, move it between hosts, keep it after the job search is over
Rent a resume builder
Resume.io · Resume Genius · Teal · Kickresume · Rezi · JobscanA hosted builder is working in five minutes, and it comes with what a build of your own does not: a hundred designs, a proofreader, and a careers content library. What you accept is an account holding your history and a meter on the way out.
- The meter is usually a short cycle: Resume.io runs a $2.95 seven-day trial that renews at $29.95 every four weeks, and Resume Genius a $2.95 fourteen-day trial that renews at $23.95 every four weeks
- Teal+ bills $13 every 7 days, $29 every 30 days or $79 every 90 days, and its free plan gives the AI cover letter generator two credits
- Free plans mostly stop at the download: Resume.io’s free plan holds one resume and one letter and exports text only, and Resume Genius’s free resume builder is text only too
- The honest part: Rezi’s free plan includes unlimited cover letters, Kickresume’s free plan allows unlimited downloads, and a free chat window writes a letter for nothing, so what any builder sells, rented or owned, is the workflow and the export rather than access to a model
- Your history lives in an account by design, because saved versions are the product, and the account outlives the search
- You get more designs than you will use, checks on the text, and a library of examples, and none of it comes with you if you leave
The shape most of this market takes: a small trial price, then a four-week cycle. Its own page says the trial "auto-renews to $29.95 billed every 4 weeks", with a quarterly option at $49.95. The free plan is "Only one resume and cover letter" with "Downloads only in TXT format".
resume.io · checked September 2026
Same shape, longer trial. The page says the plan "Auto renews after 14 days at $23.95 billed every four weeks", with an annual plan at $95.40 for twelve months. The free resume builder is "TXT only". Also the publisher of the hiring survey quoted at the top of this page.
resumegenius.com · checked September 2026
A resume builder and job tracker that meters by the week. Its free plan is "Free Forever" and gives the AI cover letter generator "2 Credits", against "Unlimited" on Teal+. Read on Teal’s own page, which puts the weekly price at $13 where search snippets say $9, a good example of why snippets are not sources.
tealhq.com · checked September 2026
A resume and cover letter builder with the AI Writer in every paid card and absent from the free one. The free plan is unusually generous on the way out: "4 basic resume templates", "4 matching cover letter templates" and "Unlimited downloads". Quarterly is $27 every 3 months.
kickresume.com · checked September 2026
In this list as a reality check rather than as a competitor. Rezi’s own FAQ says the free plan lets you "create unlimited cover and resignation letters", with one resume and three PDF downloads. If a letter is all you want, a major vendor gives it away, and this page says so rather than pretending otherwise.
rezi.ai · checked September 2026
A different meter: scans of a resume against a posting, the applicant-tracking angle. Jobscan’s own pages say free accounts "get 5 scans per month" and that Premium includes unlimited cover letter scans. The plan page itself renders no prices to a fetcher, so both figures come from Jobscan’s blog and product pages.
jobscan.co · checked September 2026
Split it by how many letters you will write. One application, this month, belongs on whatever is fastest, and a chat window is fastest. A job search, a client list, or a room full of students belongs in a builder you own, where the meter is the model’s own price and nobody’s history is kept.
Why build with v0
Skip the subscription and the server engineering. Describe the resume going in, the job posting beside it and the letter coming out, and the screens, the one function and the export take shape without you writing a line of server code.
v0 starts with the screens, and the backend comes when you ask for it: here that is one server route that writes the letter, usually once the forms already exist and there is a resume to test it with:
Sketch
Describe the screen or the form you want.
Preview
See it rendered live, and select any part of it to adjust.
Check
Fill it in with your own resume rather than trusting the picture.
Iterate
Prompt again for the next screen, or for the one route.
The order matters here more than with a full-app builder: v0 gets you a finished-looking interface fast, and the data underneath doesn’t show up until you ask for it and give it somewhere to live.
One routeand nothing stored
The whole server side is one route in the same project, holding the key in the deployment’s environment settings and writing the letter. v0 generates it beside the screens, and Vercel hosts both together.
Live preview is the feedback loop
Every prompt updates the working interface right there in the chat, so you see the actual screen changing instead of imagining it from a description.
Design mode edits without a prompt
Select an element in the live preview, adjust its style directly or type a plain-language instruction, and v0 applies the change back to the real source code as a new version.
Build cost vs. running cost
Compare the upfront cost of hiring a developer against building it yourself with your AI coding tool, plus what it actually costs to run.
Hire a developer
Custom build, from scratch- Developer
- ~$6.8k-$27k
- AI cost per letter
- Cents, at the model’s list price
- Serverless function hosting
- $0 on a free tier
- Hosting
- $0 on a free tier
- Build time
- ~135 hrs of their work
~$6.8k-$27k to build, then cents per letter to run
That band is our ~135 hour estimate priced at what the work goes for. The rate survey cited below has United States freelance web developers starting around $40/hr and reaching $150/hr and beyond with seniority, and agencies adding 20% to 40% on top of a freelancer for the same skills, which is where the $50 floor and the $200 ceiling come from. Roughly a third of those hours are the export and the designs, which is the part most people underestimate.
Build it with v0
From scratch, with v0- v0
- $0 ($5/mo of credits) to $30+/month (Plus)
- Hosting (Vercel)
- Free on Vercel’s Hobby plan
- Your time
- ~65 hrs
Free to try the idea, ~$30+/month on Plus while you build a real one, then whichever plan you keep using
v0 bills in dollars of credit rather than a flat fee, so cost tracks usage: importing the pre-built template can fit inside Free’s $5 a month, while a from-scratch build runs into Free’s 7-messages-a-day cap quickly and usually needs Plus, at $30 per user per month with no annual discount shown. Because v0 generates the interface and the backend as separate steps rather than one pass, expect more prompts to reach the same result than a tool that writes both together.
Pick either column and the tool is still yours, and the only meter on it belongs to the model provider. The arithmetic there is small enough to do in your head: at the list price re-read on 8 September 2026, the cheapest current model on the provider’s page, gpt-5.6-luna, charges $0.20 per million input tokens and $1.20 per million output tokens, and a letter sends roughly 1,500 tokens (the resume, the posting, the instructions) and gets roughly 500 back. That is about nine hundredths of a cent per letter, or a thousand letters for about ninety cents. The template’s own default model has left that price list since these pages were first written, so set the model variable to a current one before you count on any figure. Set a monthly spending limit at the provider anyway, because a public function with no cap is a bill you did not decide on.
Prices and rates from developex.com, developers.openai.com, v0.app, v0.app and vercel.com, checked September 2026.
Decide before you build
Six core choices to settle before writing code. Resolving them early saves you from painful refactoring later.
Private tool or public tool
A personal tool needs no usage caps. A public tool needs rate limits and API spending caps to prevent abuse, as the server responds to anyone who calls it. Decide your audience upfront, as a public app requires far more security planning.
Which files you accept
The template reads plain text, but users usually have PDF or Word files. Parsing those formats in the browser requires external parsing libraries. Decide whether to support direct file uploads or simply ask users to paste their text.
How much a letter may cost you
Each generation costs fractions of a cent, but an uncapped endpoint can be spammed all night. Set hard spending limits in your API provider dashboard before launch, and decide if you need daily per-user generation limits.
What the letter sounds like
Your prompt defines the tone, length, and formatting of every letter. Choose these defaults early, such as formal vs. casual tone, length, or US vs. UK spelling. You can update the prompt anytime, but older outputs won’t change.
Whether anything is kept at all
By default, refreshing the page clears all data. Saving drafts locally in the browser takes minimal effort. Saving data on a server requires user accounts, databases, and privacy compliance, turning it into a completely different product.
Which model, and who may change it
Store your AI model selection in environment variables, not in your code. Smaller models are cheaper, and larger ones write better. Keeping model settings in environment variables lets you swap models anytime without touching your codebase.
Comparing your build options
Where you begin decides how much of this becomes plumbing. The same tool three ways below: by hand, on a kit that already decided your screens, or generated screen first in v0 with the one server route added once the forms exist.
The screens are the quick part. What eats the weeks is everything around one request to a model: reading a resume out of a file, six sections of form that add and remove entries without losing what was typed, seven designs that all render the same fields, a PDF that a recruiter’s software can actually read, and the caps that stop a stranger running up your bill.
A kit gives you inputs, cards and a stepper. It has never heard of a resume, a job posting, or a letter that has to name the company correctly, so the builder’s sections, the request to the model, the designs and the export are still a developer’s week, on top of the afternoon the kit saved.
This build is mostly screens, which is what v0 is best at, and its one server piece is a route in the same project rather than a service somewhere else, which is where v0 is unusually comfortable. The checkable thing is deploying to Vercel, generating a letter from a phone on the live address, and confirming in the network panel that one request carried the resume and went to your own route.
Estimate your exact build timeframe
Uncheck features you don’t need, like resume templates or file parsing, to update your estimated hours instantly.
Your estimate
65 hrs
start to finish
Based on the 5 of 5 features you’ve selected, plus ~4h of groundwork. Toggle any on the left to watch the number move, and open the groundwork row to untick what you have already, such as a database that is already running or going live if you are only building a mock-up for now.
A rough estimate, not a quote. Real time depends on how much you customize and how clean your data is.
Let’s set up the tools you need
Four things before step 01, and one of them is optional: an account, a plan, a GitHub connection for the deploy, and an account with the AI provider whose model will write the letters. No database card appears here, and on this build that is the truth rather than a shortcut: nothing is ever saved. The last card is not a service to join, it is three documents to have ready.
v0 account
Sign in with a GitHub, Google, or email account and you land in a chat where you describe the interface you want. There’s nothing to install.
Sign up for v0v0 subscription
Free includes $5 of credits a month, capped at 7 messages a day, which is fine for trying a few screens and thin for a real build. Plus is $30 per user per month, billed monthly only (v0’s pricing page shows no annual option), and it’s the realistic floor once you’re iterating past a handful of screens.
Compare v0 plansGitHub connection
Not needed to build anything, since v0 keeps its own history of every change. Connect a repository from the chat’s Git panel and v0 also commits every code-changing message to its own branch, ready to merge as a pull request. That is the step that turns the chat into a project other tools, and other people, can use.
Connect v0 to GitHubAn AI provider account and key
The letter is written by a model you call with your own key, so open an account with the provider you prefer, create one key for this project, and set a monthly spending limit on it before you paste it anywhere. The key goes into the server function’s secrets in step 03 and never into the page, and the limit is the one setting that bounds what a public tool can cost you.
A real resume and two real postings
Before you start, save your own resume as a plain-text file and copy two job postings you would genuinely apply to: one short and one long enough to have requirements buried in it. Every step below is checked against these three rather than against sample text, because a letter that reads well for a made-up job tells you nothing about the tool.
Nothing here takes long. An account, a plan, a GitHub connection you can add when you are ready to deploy, and a key with a spending limit on it before it exists anywhere else. After that, everything is a prompt.
Build your AI resume and cover letter builder, prompt by prompt
No code to write. You describe a screen and it shows up in the live preview, where any part of it can be selected and adjusted directly. Two things are fixed in the first message and never revisited: the key lives only in the route’s environment settings, and nothing about the applicant is stored anywhere. Everything after that is checked against your own resume and two real postings rather than sample text.
- 01
Start the chat and set the rules
A running project with the form and PDF libraries in it, and three rules stated once that govern everything after: nothing stored, the key only in the route’s environment settings, all AI through that one route.
PromptSet up the projectStart a new project for a resume and cover letter tool. Use Tailwind, a form library with validation, and a library that produces PDF files from text (not from screenshots). Three rules for the whole project, to keep in mind for every later request: nothing about the user is ever stored on a server or in a database, the AI provider key exists only in the deployment’s environment settings and never in any file, and every request to a model goes through one server route we will add later. For now, show me an empty page with the app’s name on it.
Say the rules once, at the start. They are the claim this whole tool makes, and the easiest thing to break by accident three prompts later.
- 02
Two ways in, one text out
A landing screen with two paths, an upload that reads a file into text, and a guided builder with six sections that add and remove entries without losing anything. Both paths end holding the resume as one piece of text. Fill the builder in with your own history in the preview, because a form that loses an entry when a second job is added looks finished with one job in it.
PromptBuild the two entry pathsBuild the first three screens. A landing page with two choices: upload an existing resume, or build one. An upload screen that accepts a plain-text file up to 5 MB, reads it into text in the browser, shows a preview, and refuses any other type with a clear message. And a guided builder with six sections (personal details, experience, education, skills, certifications, languages), each able to add and remove entries, fully validated, keeping its entries when I go back a step. Both paths must end with the resume held as one piece of text in the app’s state, with nothing sent anywhere yet.
In the preview, add a third job, delete the second, and go back a step. Anything missing is the bug to fix before step 03. Select the section in the preview and adjust the spacing directly if the six sections feel cramped on a phone.
PromptOptional: accept the files people actually haveExtend the upload so it also accepts PDF and Word (.docx) resumes, extracting their text in the browser with a PDF text-extraction library and a .docx-to-text library, with no upload to any server. Show the extracted text in the preview so I can check nothing was lost, and keep the plain-text path working exactly as before.
Skip this if you will only ever use it yourself. Do it if anyone else will, because the first thing they drop in will be a PDF.
- 03
The job, and the one route that writes the letter
The job form, then the only server-side piece in the whole build: a route in the same project that reads the key from the environment, takes the resume and the job, applies the letter rules, calls the model and returns the letter. The caps go in now, because a route that works is a route anyone can call.
PromptBuild the job form and the routeAdd a job details screen with three fields: company, position, and the full job description pasted in, each capped at 5,000 characters with a visible counter. Then add the one server route this app will have. It reads the AI provider key and the model name from environment variables that exist only on the server, accepts the resume text and the three job fields, refuses a resume over 20,000 characters or any field over 5,000, allows at most ten requests a minute from one address, and answers only requests from an origin set in an environment variable. It sends one request to the model with these instructions: write a professional cover letter in proper business letter format with the applicant’s contact details at the top, use the applicant’s real name and background from the resume, highlight the experience that matches the job description, keep a professional but warm tone, and mark the company name and key points in bold using double asterisks. Return only the letter. Wire the form’s button to call the route and show a plain error message if the model does not answer. Tell me exactly which three environment variables to set in the project’s settings, and do not write the key into any file.
Set the three variables, generate a letter for both real postings, and read them before moving on. The tone rules are the only editorial control you have.
- 04
The letter screen, and a draft that survives a refresh
Where the letter is read, copied and taken away. Two additions earn their place here: a text area so the letter can be edited before it is copied, and a draft kept in the browser so a refresh does not send someone back to an empty builder.
PromptBuild the letter screenBuild the result screen. Render the returned letter with the double-asterisk marks shown as bold, a copy-to-clipboard button with a confirmation, a download-as-text button, and an editable version of the letter in a text area so I can change a sentence before copying. Keep the current resume text, job details and letter in the browser’s local storage so a refresh or an accidental back button returns me to where I was, and add a clearly labelled "Clear everything" button that removes all of it. Nothing may be sent to any server as part of this step, and do not add a database for this.
Refresh the preview mid-flow. Landing back on the start screen with your entries gone means the storage is not wired.
- 05
Resume designs, and a PDF a machine can read
The step this build is judged on. Several designs drawn from the same fields is the visible half. The half that decides whether an application gets read is the export: a PDF built from the resume’s text, with real selectable words in it, rather than a screenshot of the design placed on a page.
PromptBuild the designs and the exportAdd a design picker with three resume layouts (a classic single column, a two-column with a sidebar, and a compact modern one) that all render the same resume data from the builder, with a live preview. Then build the export using the PDF library from step 01: generate the PDF from the resume text and layout so the file contains real, selectable text and standard fonts, uses A4 by default with a US Letter option, and breaks cleanly across pages. Do not use a screenshot-to-image approach anywhere in the export. Also add a plain-text download of the resume.
Download the PDF, open it, and try to select a word. If you cannot, the export is a picture, and a picture is what the shipped template produces. Add designs four to seven later, once the export is right.
- 06Destination
Guardrails, then deploy
Two things left, and they decide whether anybody else can use it safely: the route must answer only your published address, and the key must have a ceiling on what it can spend. Then the project deploys to Vercel as one unit, screens and route together, and you test from a phone rather than from the tab that built it.
PromptLock the route down, then deployReview the server route before we deploy. Confirm the allowed-origin check, the input size caps and the per-address request limit all still hold, and add an optional per-day cap on total requests that returns a polite "come back tomorrow" message when it is hit. Confirm the provider key cannot reach the browser by any path, including the build output. Then tell me which environment variables to set in the Vercel project, what to set the allowed origin to once the deployment has its address, and remind me to set a monthly spending limit on the key at the provider. After that, deploy.
Set the spending limit at the provider before you share the address. Then open the deployment on a phone, generate a letter, and check in the network panel that exactly one request carried the resume and it went to your own route.
Why an applicant’s details stay private
A cover letter tool sees a person’s work history, contact details and the job they are hoping to get. Here is how this build keeps that to the browser tab and one request, and what you still have to look after yourself.
No accounts, so nothing to break into
No sign-in means no passwords to store, no session to steal, and no way to be somebody else. No database means nothing to inject into and no access rule to get wrong. Most of what goes wrong in web applications cannot go wrong here, and that is a property of the shape rather than of care taken with it.
A resume is personal data
A name, a phone number, an address, and ten years of where somebody worked. It arrives in the browser, travels once to the model inside the one request the function makes, and is kept nowhere by the tool afterwards. Say so on the page, in one sentence, and say where it does go, because a person pasting their history into a form is entitled to know, and the honest answer here is a good one.
The provider key lives on the server
The key is read by the function from its own secrets and never appears in anything the browser downloads. The one rule to hold onto is that anything pasted into the project itself is public, because a static site hands every file to whoever opens it. If the key ever ends up in the page, treat it as published and revoke it.
A function anyone can call
There are no users, so the function cannot ask who is asking. The template protects it three ways: a header naming the one site allowed to call it, which browsers enforce and a script ignores, because the function sends the header rather than checking who sent the request. A refusal of any resume over 20,000 characters or job field over 5,000. And a limit of ten requests a minute from one address, kept in memory and reset whenever the function restarts. Read all three as speed bumps rather than walls, and add the real wall below.
A spending limit is the real ceiling
None of the caps above bounds what a determined stranger can cost you over a night. The provider’s own dashboard does: set a monthly limit on the key the function uses, and a low one, because a legitimate job search is a few dollars a year at these prices. This is the single most important setting in the whole build and it is not in the code.
What the model provider does with the text
The template’s default provider states on its developer site that, as of March 2023, data sent to its API is not used to train its models unless you opt in, and that abuse-monitoring logs are kept for up to 30 days by default. So the resume is not stored by your tool, is not training material by default, and does sit in the provider’s logs for up to a month. Say that on the page in plain words, and read the equivalent page for any provider you switch to.
The seller’s project reference ships in the box
The download’s configuration file names the seller’s own project, and its README says an environment file does too, though the download carries none: you create that file from the example with your own values. Point the configuration at your project before you deploy the function, and never put the provider key in the environment file, because the browser bundle is built from it.
Storing nothing is a feature to keep
The moment you add a history, a saved draft on a server, or a login so people can come back, you have a database holding personal data and every rule that follows from that: access control, retention, deletion on request, a breach plan. If you want drafts to survive a refresh, keep them in the browser, on the applicant’s own machine, where the same rules apply as to any file they have.
Read this project the way somebody cautious about their personal data would. First, list every request the finished page makes over the network, including anything a library loads on its own, and say what each one carries. Second, read the server function and tell me: what it accepts and from where, what stops a stranger calling it in a loop, what happens when the model does not answer, and whether the provider key can reach the browser by any path. Third, confirm nothing about the resume or the letter is written anywhere that survives the tab being closed. For anything that fails, fix it and show me the change.
Worth running twice: once before you publish, and again the first time you add a feature that sends text to the model, because the list of what leaves the page is the whole privacy story and it changes without anybody deciding it should.
One rule outranks the rest: the key stays in the function, the resume stays in the tab, and nothing is written anywhere that outlives it. Everything else in this section is detail.
What speeds the build, and what slows it
Speeds the build
- Generating the six screens first and only then asking for the route, so the route is written against forms that already exist
- Keeping the provider key in the deployment’s environment settings from the first deploy, never in a file v0 can see
- Selecting a section of the builder in the preview and adjusting it directly rather than describing the change in words
Slows the build
- Asking for seven resume designs before the export produces a PDF with text in it
- Letting v0 add a database "to save drafts" when the browser’s own storage is the right place for them
- Testing only in the desktop preview, when the builder’s six sections are where a phone screen breaks first
Connecting GitHub (Optional)
Every change in v0 is saved automatically without any technical setup. You only need to link GitHub if you want a private copy under your own control or plan to hand the codebase over to external developers.
Every message is a version
Each time a message changes your code, v0 saves it as a new version. Restoring an older one adds it back as the newest version instead of branching, so the history stays one straight line.
Versions, v0 docsUndo from the chat itself
Scroll back through the conversation and click the revert arrow on any earlier reply, or open the version number in the top right to jump straight to a specific one.
Connecting GitHub creates a real repository
From the chat’s Git panel, connect an existing repository or create one. v0 never writes straight to your main branch: every code-changing message is committed to its own working branch first.
GitHub integration, v0 docsA pull request is how it gets merged
When you’re ready, publish and open a pull request from that working branch into your base branch, review it like any other, and merge it. Starting a new chat picks up a fresh branch for the next round of changes.
This can also be v0’s deploy path
If the branch your pull requests merge into is also the linked Vercel project’s production branch, merging one triggers a production deployment. If it isn’t, the merge just follows whatever branch behavior that Vercel project is already configured with.
GitHub integration, v0 docsWhere to host your application
Hosting gives your app a home on the internet so anyone can open it via a web link. Choose a service below to make your site live. (There is no database here. The one server function that holds your AI key is covered below.)
| Host | Best for | Notes | Free tier |
|---|---|---|---|
| Vercel | One-click deploys | Connect the repository and each push goes live on its own. A Vite project needs no configuration, and the template ships the routing rule Vercel wants so a link to the job step does not answer not-found. Read the plan terms first: Hobby is licensed for personal, non-commercial use, which covers your own job search and not a tool you charge clients for. | Pro from $20/user/mo (Hobby is non-commercial) |
| Netlify | Drag and drop, or Git | Connect the repository, or drop the built folder onto the page and be live in a minute, which is genuinely the fastest way to put this in front of a friend this afternoon. Add the redirect rule it asks for, because a client-side route with no rule behind it is a not-found page the first time somebody refreshes. | Free tier |
| Cloudflare Pages | Serving it from nearby | Served from the location nearest whoever opened it, which suits a tool people use for three minutes and close. Its functions run beside the pages, so moving the letter-writing function onto the same host makes this a single project rather than two. | Generous free tier |
| GitHub Pages | Free Git-based hosting | Publishes straight from the repository after one routing setting. Free publishing needs a public repository, which costs less here than on most builds: there are no keys in this project and nothing private in it, once the configuration file names your own project rather than the seller’s. | Free from a public repo only |
| Firebase Hosting | One command to publish | Set it up once and every later release is a single command. Nothing in this build needs anything Firebase offers, so this row exists for readers whose other projects already live there and who want one console. | Free Spark tier |
| AWS Amplify Hosting | Teams already on AWS | Connect the project in the AWS console and add the one redirect rule a client-side route needs. Almost nobody picks this for the tool’s sake. You pick it because your organisation already decided which cloud it uses. | Free tier (build + hosting) |
| Surge | Publishing from the terminal | A single command puts the built folder on an address, with no repository anywhere in the process. Good for handing a colleague something to try before you decide where it lives, and wrong for the address a careers service prints on a poster. | Free, unlimited publishing |
| DigitalOcean App Platform | DigitalOcean users | Both the pages and the one function can live in the account you already have if you would rather keep everything on one invoice. The whole case is one fewer supplier, which for a small studio is a real argument. | Free, 3 static sites, 1 GB/mo transfer |
Any of these will serve the pages. Two things to check rather than assume: whether the free tier allows commercial use, since a tool you charge clients for is commercial however small it is, and whether the host can also run your one function, because keeping the pages and the function on one provider is one fewer account to look after.
The failure to expect on launch day is a generate button that works on your machine and fails on the published address. The function sends a header naming the one site allowed to call it, read from a setting, and until that setting is your published domain the browser refuses the reply. The configuration file in the download also names the seller’s project, so point it at your own before you deploy the function, set the key and the allowed site as that project’s secrets, then generate a letter from a phone on the live address and check in the network panel that the request went to your function’s address and nobody else’s.
No database, and exactly one function
This app is completely stateless. You only need a single serverless function to keep your API key secure and process requests. Choose where to deploy it below.
| Service | Best for | Notes | Free tier |
|---|---|---|---|
| The functions service the template ships for | Running the function as written | The template ships its function ready for Supabase’s hosted edge functions, and you can use them with no database in the project at all: create a project, deploy the one function, set the provider key and the allowed site as its secrets, and point the page at it. The free plan includes far more function calls than a job search or a small cohort will make, and it pauses a project after a week without activity, so a tool used in bursts either gets woken before a session or moves to the paid plan. | Free plan, pauses when idle |
| Your host’s own functions | One provider for everything | Vercel’s Hobby plan includes one million function invocations a month and is for personal, non-commercial use only, so it covers your own job search and not a tool you run for clients. Netlify’s free plan is 300 credits a month with a hard limit that pauses every site on the account when the balance reaches zero. Cloudflare Workers allow 100,000 requests a day free and count only CPU time, so the seconds spent waiting on the model cost nothing. Any of the three keeps the pages and the function on one account. | Free tiers on Vercel, Netlify and Cloudflare |
| A database | Not this build | Listed to rule out. Every functions provider above will also offer you a database, and there is nothing in a cover letter builder to put in one. Adding one because it was offered is how a tool that holds personal data for a minute becomes a service that holds it indefinitely, with the access rules, retention and deletion duties that follow. | Not needed |
That is the whole of the server side: one function, wherever you run it. The key goes in that function’s secrets and nowhere else, and the spending limit goes on the key at the provider.
More features without extra infrastructure
Reuse your single server function to add new AI capabilities. Every prompt below routes through the same backend without requiring extra services or additional API keys.
Rewrite with an instruction
The template writes the letter once. The most requested thing after that is a second pass with a note attached: shorter, warmer, lead with the second job, drop the paragraph about the degree. Send the letter back through the same function with the instruction and show the new version beside the old, because a rewrite you cannot compare is a rewrite you cannot judge.
Add a "Rewrite" action under the generated letter with a short text field for an instruction (for example "make it shorter" or "more formal"). Send the current letter, the original resume, the job details and my instruction through the existing ai function, asking for a revised letter that keeps every fact from the resume unchanged. Show the new version next to the previous one with a button to keep either, and add a request-per-minute limit on this action in the function so a rewrite loop cannot run away.
Requirements matched against the resume
A posting lists what it wants and a resume either shows it or does not. Ask the model to extract the requirements first, then to mark each one as evidenced, partly evidenced, or missing, citing the line of the resume it relied on. The honest version of this feature says "missing" out loud, which is more useful to an applicant than a letter that papers over it.
Add a "Match" panel on the job details step. Through the ai function, extract the requirements from the pasted posting as a list, then for each one say whether the resume evidences it, partly evidences it, or does not, quoting the resume line you relied on. Show the three groups in that order, never invent experience, and let me tick the missing ones I genuinely have so the letter can mention them.
A summary line tailored to the role
Rewriting a whole resume for every job is how people end up with six versions and no idea which one they sent. Rewriting the two-line summary at the top is enough to make it read as written for this role, and it is the one part of a resume that is opinion rather than record, so the model can be trusted with it.
Add an optional "Tailor the summary" step after the job details. Send the resume’s summary or opening lines, the posting and the job title through the ai function and ask for two alternative summary paragraphs of at most 40 words each, written for this role and using only facts present in the resume. Let me pick one or keep the original, and use the choice in every resume design and export.
Tighter rules for the letter itself
The template sends the model one message with the rules and the documents mixed together, no cap on how long the reply may be, and no setting for spelling. Three small changes to the function make every letter more predictable: the rules in a system message, a ceiling on length, and a switch between British and American spelling read from a setting rather than baked into the words.
Change the server function’s request to the model without changing what it accepts. Put the letter rules in a system message and the resume and job details in the user message, add a cap on the reply of about 450 words, and add a spelling setting (British or American) read from an environment variable and stated in the rules. Keep the model name in its own environment variable. Then generate letters for my two test postings and show me the old and new versions side by side.
Interview questions from the same two documents
The resume and the posting together are exactly what an interviewer has in front of them, so the same inputs can produce the questions they are likely to ask and a first draft of an answer grounded in the applicant’s own history. Keep it grounded: a suggested answer that invents a project is worse than no suggestion.
After the letter is generated, add a "Prepare for the interview" action. Through the ai function, produce eight likely interview questions for this posting, and for each one a two-sentence answer outline that uses only experience present in the resume, marking any question the resume gives no material for as "no evidence in resume" rather than inventing an answer. Let me copy the whole list as text.
v0 doesn’t ship its own model for these prompts, so you bring an API key for whichever provider you want, and v0 writes the route that calls it. Start with a cheap model while you’re still iterating on the prompt itself, then swap in a stronger one for the version that ships, and keep every AI feature behind that one route so there’s only one key to rotate.
Get a head start with our template
The sections above describe the build from nothing. Our template is the same tool already running: both entry paths, the seven designs, the function with its caps and the exports, so your hours go on the tone, the look and the export rather than on wiring.
AI Resume & Cover Letter Builder
The exact cover letter builder this guide builds, packaged so you can open it, point it at your own backend, and make it yours from there. Upload or build a resume, paste in the job, and pick a template - then get a cover letter written for that exact role in seconds, plus an exportable PDF resume. The part of applying everyone dreads, done in a couple of clicks.
The key benefits of starting with a template
All time-consuming boilerplate (form logic, 7 responsive designs, and secure API limits) is built and ready. Focus only on what makes your app unique.
Building the builder from scratch
~65 hrs
Opening the template, already built
~1 hr
~64 hrs of building you skip
The two figures measure different things on purpose: one is building the tool, the other is opening and running a tool that already exists. Two jobs belong to neither figure, because you do them either way. The resume PDF needs rebuilding from text so that a recruiter’s software can read it, and the upload needs to accept the files people actually have. Both are in the build steps above.
Pre-built data ingestion
The text upload with its type and size checks, and the six-section guided builder with add and remove on every section, both ending at the same job form. Running before you have written a line, which on a build that is mostly forms is most of the visible work.
Secured serverless backend
One server function that holds the key, applies the letter rules, refuses oversized input, limits requests from one address and names the one site allowed to call it. You change the tone and set the spending limit. The shape is done.
7 layouts, single data schema
A corporate classic, a sidebar layout, tech, research, creative, executive and a modern default, all reading the same data the builder collected, so a change of mind about the look costs a click rather than an afternoon.
Transparent scope & documentation
The README says plainly what is missing: text-only upload, no PDF of the letter, nothing stored, an unauthenticated function. A template that tells you its limits is one you can plan around, and every one of those limits has a step above that addresses it.
From founders who build on our templates
Saved me 60+ hours of tedious setup. Clean stateless code, built-in rate limits, and ready to deploy in under an hour. Best boilerplate for AI micro-SaaS!
Jeevan ThomasFounder & CEO, Hado.aiCommon questions
Into the browser tab, then once to the model, and nowhere else. The page reads the file or the builder’s entries into text, sends that text with the job details to the one server function, and the function passes it to the model provider and returns the letter. Nothing is written to a database, because there is none, and nothing survives the tab being closed. The one place your text does travel is to the model provider, which is the trade the whole tool is built on. The template’s default provider says on its developer site that API data is not used for training unless you opt in and that abuse-monitoring logs are kept for up to 30 days, and the security section says what to check if you switch providers.
No, and it is worth being clear about why not, because every tool that helps you build software will offer you one. A cover letter is written once and taken away. There is no history to keep, no account to return to, and no record that needs to exist after the download. The only server-side piece is the function that holds the AI key, and that runs on any functions service without a database beside it. Add one only if you decide to build a different product, one with accounts, and then read the security section again first.
A fraction of a cent, at the list price of the cheapest current model on the provider’s page. A letter sends roughly 1,500 tokens (the resume, the posting and the instructions) and gets roughly 500 back, and the arithmetic in the costs section above works that out to about nine hundredths of a cent per letter, or a thousand letters for about ninety cents. The template’s default model no longer has a published price, so set the model variable to a current one. The cost worth planning for is not the letter, it is a public function with no spending limit, which is why the security section puts the limit at the provider first.
Not as it ships. The upload accepts a plain-text file up to 5 MB and refuses anything else on purpose, because the page reads the file as text and a PDF or a Word document read that way is noise. Two ways round it: paste your resume into a text file first, which takes a minute, or add the two libraries that read those formats in the browser, which step 02 of every page offers as a prompt. Both keep the file on your machine.
Not the one the template ships, and this is the single most important thing to fix before you send anything. The export takes a picture of the rendered design and places it on A4 pages, so the file looks right and contains no text at all. Software that parses resumes sees a blank page. Step 05 of every page rebuilds the export from the resume’s text, so the PDF a recruiter opens is also the PDF their system can read.
Copy it and edit it wherever you write, which is what most people do with a cover letter anyway, since it usually ends up pasted into an application form. The template does not offer editing in place or a second pass with instructions. The first item in the AI section above adds a rewrite with an instruction, and the letter screen step adds a plain text area, so both are an afternoon rather than a project.
Yes, from a link, with no account, and that is where the decisions in the section above start to matter. A page anyone can open is a function anyone can call, so before you share the address, set the allowed origin, keep the request limits, and above all set a spending limit on the key at the provider. After that a whole cohort can use it and the bill is a few dollars, which is the point.
In one place, which is the best feature of keeping the prompt on the server. The function holds the instructions: letter format, tone, what to take from the resume, what to mark in bold. Change the tone there and every letter after that inherits it. If you run this for clients or a cohort, that is where a house voice lives, and where you would switch spelling between British and American.
A small, inexpensive model from one provider by default, set by an environment variable on the function rather than in the code, so switching to a larger model is a settings change and not a rewrite. The default the template ships has since left the provider’s price list, so set the variable to a current model on your first deploy. The costs section prices the cheapest current one on the date it was read, because model names and prices change faster than anything else on this page. A larger model writes a better letter and costs more per letter, and both are still cents.
No. What you end up with is a folder of files and one small function: move the pages between hosts in an afternoon, move the function to whichever functions service your host offers, and swap the model provider by changing the function’s one request. There is no account anywhere holding your history, which is the lock-in a subscription builder actually has, and the reason people keep paying one after the search is over.
No. You describe the screen you want in the chat and v0 generates it, and you can select any part of the preview and adjust it directly. The one server piece this build has is a route in the same project, which v0 writes when you ask for it, with the provider key set in the deployment’s environment settings rather than typed anywhere. Nothing here involves a database, so the step that usually needs the most explaining on a v0 build does not appear at all.
Both, and on this build the backend is one route: it receives the resume and the job, applies the letter rules, calls the model with a key that lives in the deployment’s settings, and returns the letter. v0 writes that route in the same project as the screens once you ask for it in step 03, and Vercel hosts both together. Worth knowing if you buy our template as well: it is built as a Vite app, and v0 works in Next.js, so bringing the template into v0 is a rewrite rather than an import. The template’s own README says so, and says it is a small one because there is no database to carry across.
Free plan credits reset monthly, and the 7-messages-a-day cap resets every day. If you hit either limit mid-build, what you’ve already built stays put. You wait for the reset or move up to Plus to keep going right away.
References
Sources checked September 2026- 012026 Hiring Trends Report (hiring managers and candidate AI use), Resume Genius. resumegenius.com (published July 2026)
- 02Pricing (trial, four-week renewal, free plan limits), Resume.io. resume.io
- 03Pricing (trial, four-week renewal, annual plan, free tier), Resume Genius. resumegenius.com
- 04Pricing (weekly, 30-day and 90-day plans, free plan credits), Teal. tealhq.com
- 05Pricing (monthly, quarterly and yearly plans, free plan), Kickresume. kickresume.com
- 06Pricing (free plan with unlimited cover letters, Pro and Lifetime), Rezi. rezi.ai
- 07Jobscan vs Enhancv (Jobscan Premium and free plan pricing), Jobscan. jobscan.co
- 08Jobscan Premium (free scans per month, cover letter report), Jobscan. jobscan.co
- 09Data controls in the OpenAI platform (API data not used for training by default, 30-day abuse logs), OpenAI. developers.openai.com
- 10Pricing (Hobby plan function invocations), Vercel. vercel.com
- 11Hobby plan (personal, non-commercial use), Vercel docs. vercel.com
- 12How credits work (free plan allowance and hard limit), Netlify docs. docs.netlify.com
- 13Workers pricing (free plan requests and CPU time), Cloudflare docs. developers.cloudflare.com
- 14API pricing (text model token prices), OpenAI. developers.openai.com
- 15Web developer hourly rates 2026 (freelance and agency benchmarks). developex.com
- 16v0 homepage. v0.app
- 17Pricing (Plus, Business), v0. v0.app
- 18Pricing details (Free tier, credit rollover), v0 docs. v0.app
- 19Full-stack apps, v0 docs. v0.app
- 20GitHub integration, v0 docs. v0.app
- 21Deployments, v0 docs. v0.app
- 22Design mode, v0 docs. v0.app
- 23Versions, v0 docs. v0.app
This guide is general information, not careers advice, and nothing here checks that a letter or a resume is accurate: what an applicant claims is their responsibility, and the prompts above are written to invent nothing. Third-party prices, plan terms, and market rates are quoted from the sources above and were last checked on the date shown. Vendors change them without notice, so confirm before you budget. The per-letter cost is arithmetic on a list price and a typical letter length, not a measurement of your usage. Build hours and the cost estimates derived from them are our own estimates, not quotes. v0 is a product of Vercel. Verify current capabilities and pricing before relying on them.