How to build an AI resume and cover letter builder with OpenAI Codex
A cover letter for the exact role, written in seconds from the resume you already have, with no account and nothing stored. Build the tool that does it with Codex working task by task on the real source: the forms, one server function holding your key, and an export a recruiter’s software can read.
OpenAI Codex
$ 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 function holding my AI key, and exports the resume as a real PDF.
- Upload and builder running
- Letter written through the function
- 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 Codex
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.
Codex closes that gap by working the way a developer would, just faster. The whole workflow becomes a simple loop:
Describe
Tell Codex what you want, in plain language.
Build
It edits the real project files, backend and auth and UI, rather than replying in a chat.
Check
Run the app yourself and confirm the change works.
Repeat
Describe the next change.
None of that loop needs a computer-science background, which is why one person can take an idea to a working app over a handful of focused sessions.
One functionand nothing stored
The whole server side is one function that holds the key and writes the letter. Codex writes the page and the function against the same rules, and can run the function itself to show the caps holding.
Any language is the interface
There’s no code to write, and no requirement to describe it in English. Ask for a new field, a renamed step, or an AI summary in whatever language you think in, and Codex implements it.
Local files it edits directly
Codex works on the project on your own disk rather than a copy somewhere else, so what it changes is exactly what you see when you run the app. Point it at the handful of files that matter and it stays fast and focused.
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 Codex
From scratch, with Codex- Codex
- ~$20/month (Plus) to ~$200/month (Pro)
- Hosting
- $0 on a free tier
- Your time
- ~65 hrs
~$20-$200/month while you build, then whichever plan you keep using
Codex itself is free to install. The cost sits in the ChatGPT plan behind it, or in API usage if you sign in with a key instead. Plus, around $20/month, covers a template import or a short build. A from-scratch build that runs for weeks usually needs Pro’s top usage-multiplier tier instead, which lands around $100 to $200 a month. The fee doesn’t shrink when you start from a template the way a per-hour developer bill would: the template changes how many of the hours in the estimator above you actually spend, not which ChatGPT plan you’re paying for.
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 and learn.chatgpt.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
The starting point decides how much of the estimate goes on the parts a user sees and how much on the export and the function behind them. Three routes to the same tool below: every line by hand, a kit that hands you inputs and a stepper, or Codex working task by task on the real source.
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.
Hand Codex a task and it edits the files, runs the build, and reports back, which suits a build made of many small verifiable pieces: a section that keeps its entries, a function that refuses an oversized request, a PDF that contains text. The checkable thing is asking it to run the finished function against your own resume and a real posting, then to open the exported PDF and search it for your surname.
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 none takes long: two installers, a ChatGPT plan that includes Codex, and an account with the AI provider whose model will write the letters. There is no database card here, because this build creates no database. The last card is not a service to join, it is three documents to have ready.
OpenAI Codex
Your main AI assistant. The app itself costs nothing and installs with a single command from OpenAI, then runs in your Terminal. What it costs to use is the next card: every request spends the usage allowance on your ChatGPT plan, and the free plan’s allowance is small enough that a build of this size stops early. Codex is also built into an extension for popular code editors and into the ChatGPT desktop app, which can hand a longer task off to Codex cloud to keep running in an isolated environment while you do something else.
Install Codex CLIChatGPT plan
Codex is technically included on the free ChatGPT plan too, but Free’s usage is the tightest of any tier. OpenAI doesn’t publish Free’s own cap, only that every paid tier gets a larger multiple of it, so treat Free as a way to try Codex rather than to build with it. ChatGPT Plus, around $20/month, is the realistic starting point, and a long, from-scratch build tends to need the top ChatGPT Pro tier, priced by usage multiplier at roughly $100 to $200/month. Codex can also run on pay-as-you-go API billing instead of a ChatGPT plan, if you’d rather pay per token than hold a subscription.
Compare ChatGPT plansNode.js engine
The engine that runs your app on your own computer. You never have to learn how it works: download the version marked LTS (the most stable one), install it, and forget about it.
Download Node.js (LTS)An 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 is worth memorizing. The first three just need to exist on your machine, the key needs a spending limit before it exists anywhere else, and the documents are files you already have. From step 01 on, you hand Codex a task and it runs the commands.
Build your AI resume and cover letter builder, prompt by prompt
No code to write. You hand Codex a task, it edits the files and runs the commands, and you check the result. Two things are fixed on the first task and never revisited: the key lives only in the function, 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
Get the project running
An empty app on your machine with the form and PDF libraries already in, and a short notes file carrying the three rules of this build, which Codex reads at the start of every task.
PromptSet up the projectScaffold a new React 18 + Vite + TypeScript project and add Tailwind, a form library with validation, and a library that produces PDF files from text (not from screenshots). Add an empty serverless function folder for the one server piece this app will have. Create an AGENTS.md with three rules: nothing about the user is ever stored on a server or in a database, the AI provider key exists only in the server function’s secrets and never in the browser bundle, and every request to a model goes through that one function. Start the dev server and confirm a blank page renders.
The notes file is how the rules survive between tasks. Codex reads it before each one, which is exactly when a rule is most likely to be broken by accident.
- 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. Test the builder with your real history, because a form that loses an entry when a second job is added looks finished with one job in it.
PromptBuild the two entry pathsTask: build 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. 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 end with the resume held as one piece of text in app state, with nothing sent anywhere. Run the app and report what you tested.
Then do the test yourself: fill in your own history, add a third job, delete the second, go back a step. Anything missing is the bug to fix before step 03.
PromptOptional: accept the files people actually haveTask: extend the upload to accept PDF and Word (.docx) resumes as well, extracting the 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 unchanged.
Skip it for a tool only you will use. Do it for anyone else, because the first thing they will drop in is a PDF.
- 03
The job, and the one function that writes the letter
The job form, then the only server-side piece in the whole build: a function that reads the key from its secrets, takes the resume and the job, applies the letter rules, calls the model and returns the letter. The caps go in now, because a function that works is a function anyone can call.
PromptBuild the job form and the functionTask: add 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 write the one serverless function this app will have. It reads the AI provider key and the model name from server-only environment variables, accepts a JSON body with 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 with double asterisks. Return only the letter. Wire the form to call the function and show a plain error if the model does not answer. Show me how to set the three variables locally without the key entering any file the browser bundle is built from, then run the function against the resume and posting in the test folder and paste me the letter.
Read the letter before moving on, then run it against the second posting. The tone rules are the only editorial control you have, and this is the cheapest moment to change them.
- 04
The letter screen, and a draft that survives a refresh
Where the letter is read, copied and taken away. The template stops at copy and download. Two additions earn their place: a text area so the letter can be edited before copying, and a draft kept in the browser so a refresh does not empty the builder.
PromptBuild the letter screenTask: build the result screen. Render the letter with the double-asterisk marks shown as bold, add copy-to-clipboard with a confirmation, download-as-text, and an editable text area so a sentence can be changed before copying. Keep the current resume text, job details and letter in the browser’s local storage so a refresh or a stray back button returns me to where I was, with a clearly labelled "Clear everything" button that removes all of it. Nothing may be sent to any server in this step.
Refresh 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 exportTask: add 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, with a live preview. Build the export with the PDF library from step 01, generating the file from the resume text and layout so it contains real selectable text and standard fonts, uses A4 by default with a US Letter option, and breaks cleanly across pages. Do not use any screenshot-to-image approach. Add a plain-text download too. Then open the generated PDF, search it for a word from the test resume, and report whether the search found it.
If the search finds nothing, the export is a picture, which is what the shipped template produces. Add designs four to seven later, once the export is right.
- 06Destination
Guardrails, then publish
Two things left: the function must answer only your published address, and the key must have a ceiling on what it can spend. Then the pages go to a static host and the function to a functions service, and you test from a phone rather than from the machine that built it.
PromptLock the function downTask: review the server function before release. Confirm the allowed-origin check, the input size caps and the per-address limit still hold, add an optional per-day cap on total requests with a polite "come back tomorrow" message, and confirm the provider key cannot reach the browser by any path, including the build output. Then walk me through setting a monthly spending limit on the key at the provider’s dashboard, and tell me what to set the allowed origin to once I have a real domain.
Set the spending limit at the provider before the address exists anywhere public. It is the one protection here that is not code.
PromptPublish itTask: build the pages for release and walk me through deploying them to a static host, including the rewrite rule a client-side route needs so a link to the job step does not 404. Deploy the function to a functions service with its three environment variables set there, set the allowed origin to the published domain, and point the pages at the function’s address. Then list what I should check on the published address rather than locally: a letter generated from a phone, the network panel showing exactly one request carrying the resume and going to my function, and the exported PDF still containing selectable text.
The network panel check on the live address is the whole privacy promise of this tool, and it takes about a minute.
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
- An AGENTS.md file at your project root: Codex reads it automatically before every task, so you never have to remind it
- Setting Codex’s permissions once for the session, instead of approving every small edit by hand
- Handing a long, well-scoped task to Codex cloud, so it keeps working in an isolated environment while you do something else
- Reviewing a diff in the IDE extension, next to the code it touched, before you keep it
Slows the build
- Leaving permissions wide open for a sensitive change instead of narrowing them for that one task
- Skipping the AGENTS.md file, so Codex starts each new task without your conventions loaded
- Handing Codex cloud a vague, open-ended task, where you can’t steer it mid-run the way you can in a live terminal session
- Merging a cloud task’s changes back in without reading the diff first
Git: what it is, and why you need it
Before you build anything, meet the one tool that makes building safe. You need no coding background for it: Git remembers every version of your project, so you can try things, break things, and get back to a working state in seconds.
What Git actually is
Git is a quiet recorder that runs alongside your project. Each time you save your work it keeps a full snapshot, so the entire history of your project lives on your computer, not just whatever the files look like right now.
Why you need it
Codex asks before it edits files or runs commands, unless you widen its permissions for the session. Once you do, Git is what makes that safe: there’s always a working version to return to, so you can hand it a bigger task without the fear of losing what already works.
A commit is a save point
Each commit is a snapshot with a short note, like “added the home page”. Make one after every working step and you can jump back to any of them later.
GitHub’s beginner guide to GitUndo anything, safely
If a change breaks something, you roll back to the last good commit instead of unpicking it by hand. It’s the safety net that keeps a Codex session low-risk even once you’ve widened its permissions.
GitHub is also where Codex can start from
Git lives on your computer. GitHub is a free, private cloud copy of the same project. Keep it private, and never commit secret keys or passwords. Once your project is pushed there, Codex cloud can pick up a task straight from a GitHub issue or repo, without you opening a terminal at all.
Create a free GitHub accountYou rarely type git commands
There’s little to memorize. Ask Codex to “commit this” or “undo the last change” and it runs the git steps for you, inside whatever permission boundary you’ve set. Prefer clicking to typing? The Codex extension for your editor shows each change next to the code it touched before you keep it, and GitHub Desktop gives you plain buttons for saving and rolling back.
Get CodexWhere 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.
Each prompt above should pick whichever model tier fits the job: a fast, lower-cost model for high-volume work, and a stronger reasoning model for anything that weighs tradeoffs against each other. Codex’s model names change faster than this page does, so check OpenAI’s current model line-up (linked in the references below) before you build, rather than copying a name you saw once. Keep all of it behind that same ai function, so one key and one rule set covers every feature you add.
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. A handful of commands get typed along the way: installing Codex, starting the app, building the pages for release, deploying the function. Each is one line to copy, the setup section links every one, and once Codex knows the project it runs most of them for you. Nothing here involves a database, so the commands people find most intimidating on other builds never come up.
ChatGPT will write you a cover letter, and for one application that may be all you need. Codex builds the tool that writes them: it works on the real project on your machine, so what you end up with is a page with two ways in, a function holding your key, and an export a recruiter’s software can read, published on your own domain and usable by anyone you send the link to. The chat gives you a letter. Codex gives you the thing that makes them.
On a ChatGPT plan, Codex’s usage resets on a rolling window rather than billing per token, so a heavy day of building can bump into a limit. You either wait for it to reset, move up a plan, or switch to pay-as-you-go API billing for the rest of the session. Nothing you’ve already built is lost either way, so the work only pauses.
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
- 16Pricing (plans, usage limits), ChatGPT docs. learn.chatgpt.com
- 17Codex CLI, ChatGPT docs. learn.chatgpt.com
- 18IDE extension, ChatGPT docs. learn.chatgpt.com
- 19ChatGPT desktop app, ChatGPT docs. learn.chatgpt.com
- 20Codex cloud, ChatGPT docs. learn.chatgpt.com
- 21AGENTS.md, ChatGPT docs. learn.chatgpt.com
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. Codex, ChatGPT, and the OpenAI API are products of OpenAI. Verify current capabilities and pricing before relying on them.