Build Enhancv
YESreplaces $24.99/mosaves $299.88/yrback to the verdict
One structured record of your experience producing several tailored resumes: a plain version whose extracted text comes out in the right order, a designed version for a human reader, tailoring that only rearranges and rephrases what you recorded, and a check that every generated line traces back to an entry.
Before step 1
Everything below is assumed from the first step. Tick each one when you actually have it, not when you plan to.
- installfree
Why Runs the build and the PDF generation.
Get it nodejs.org, or nvm install 22. open ↗
Verify
node --version prints v22 or higher - installfree
Why Phase 2's check is the whole point and it cannot be done by looking at the page. You need to see the text in the order a machine reads it.
Get it poppler utilities provide a text extractor, or use any library that reports extraction order.
Verify
Extracting a two column PDF visibly interleaves its columns - have readyfree, and it is the most valuable hour here
Why Everything is derived from it, and it cannot be generated. Roles, dates, projects and metrics you could defend.
Get it Set aside an hour and write it from memory and records rather than from an existing resume.
Verify
Every role you would mention has an entry with real dates - have readyfree
Why Tailoring and relevance ranking cannot be judged against invented postings, and real ones contain the vague requirements that break naive matching.
Get it Save three for roles you would actually apply for.
Verify
Three descriptions are stored as fixtures - API keypay per token; tailoring one document is a fraction of a cent
Why Phase 4 only. The record, the templates and the extraction checks all work without one.
Get it A provider key with a spend limit, or a local model if you would rather your employment history stayed on the machine.
Verify
A tailored document generates and passes validation
Data model
Create these before the first phase that stores anything. Changing a table later is the expensive kind of change.
- profile(id, name, contact_json, summary) - entries(id, kind, title, organisation, started_on, ended_on, location, bullets_json, metrics_json) · kind is role, project, education, certification - skills(id, name, category, evidence_entry_ids_json) · a skill with no supporting entry is a claim with no basis - documents(id, name, template_key, target_role, entry_ids_json, generated_at, pdf_path) - generated_lines(document_id, line, source_entry_id, source_kind) · every line traces to an entry - extraction_checks(document_id, at, extracted_text, order_ok, notes) - Nothing appears on a document that does not reference an entry in the record.
Environment variables
These go in a .env file the app reads at startup. The pack's .env.example is this table as a file · copy it, never commit the filled-in version.
| Variable | Needed | Example | Where the value comes from |
|---|---|---|---|
RECORD_PATH | required | ./data/record.json | Your experience record. Private, and worth backing up. |
DOCUMENTS_DIR | required | ./data/documents | Generated PDFs with their record snapshots. |
MIN_FONT_PT | required | 9.5 | Below this the layout reports overflow instead of shrinking. |
TARGET_PAGES | required | 2 | Page target. Exceeding it suggests cuts rather than shrinking type. |
MODEL_PROVIDER | required | local | Which adapter tailoring uses. Local means your history stays on the machine. |
The build, in order
The record, written once
Everything you might claim exists in one place, in your own words.
Real dates, your own wording, metrics only where you can support them.
Files
src/record.tsA skill references the entries that demonstrate it. Unsupported skills are flagged.
Files
src/skills.tsReadable Markdown, so it outlives this tool.
Files
src/export.ts
done when · tick each as it passeswatch out- Building from an existing resume means you are rephrasing a rephrasing, and small inflations compound until you cannot remember what you actually claimed where. Write the record from the work itself, and treat a metric you cannot defend in an interview as one that should be empty.
A document that parses correctly
The plain version's extracted text comes out in reading order.
Standard headings, real text, no graphics carrying information.
Files
src/templates/plain.tsWith a text extraction tool, as an automated check rather than a manual one.
Files
src/verify-extraction.tsterminalpdftotext -layout plain.pdf -
Generating a document runs the extraction check and reports the result.
Files
src/generate.ts
done when · tick each as it passeswatch out- Multi-column layouts extract by position rather than by reading order, so a two column resume commonly comes out interleaved: a line of your job title followed by a line from the sidebar. Verify by extracting rather than by looking at the page.
- Icons or text rendered as images extract as nothing, so contact details in a graphic simply do not exist to whatever reads the file first.
The designed version, and saying which is which
You get a document that looks good, and you are told where to send each version.
From the same record. Columns and hierarchy, accepting the extraction cost.
Files
src/templates/designed.tsSide by side. The comparison is the information the user needs.
Files
src/verify-extraction.tsWith a warning if the designed one is chosen for a system that will parse it.
Files
src/generate.ts
done when · tick each as it passeswatch out- Producing only the designed version, or defaulting to it, means it gets uploaded to systems that read it badly and the application fails before a person sees it. Generate both, report both extraction results, and make the plain one the default for anything uploaded.
Tailoring that cannot invent
A version targeted at a role rearranges what you did and adds nothing.
Against the description. Selection is most of tailoring and needs no model.
Files
src/tailor.tsConstrained to the bullet's own content. Ask for structured output naming the source entry.
Files
src/rephrase.tsA pure function, unit tested with a crafted unsupported line.
Files
src/validate.tssrc/validate.test.ts
done when · tick each as it passeswatch out- A model asked to tailor a resume will add a plausible achievement, and it will read as the strongest line on the page. Validate every line against the record and reject rather than trusting an instruction, because the failure surfaces in an interview where you have to either defend it or retract it.
Length, which is a decision rather than a font size
Fitting a page means cutting something, not shrinking the type.
Below it the document reports overflow. This is the rule that keeps output readable.
Files
src/layout.tsLeast relevant to the target role first. The suggestion is the useful part.
Files
src/trim.tsRemoving a suggestion should actually bring it within the target.
done when · tick each as it passeswatch out- Auto-shrinking to fit produces a resume at eight point type that nobody reads and that signals you could not edit. Report the overflow, suggest the least relevant entries, and let the person cut, because deciding what to remove is judgement rather than layout.
Versions, records and what you sent whereproduct builder
You can answer which document went to which application, months later.
So a document generated in March reflects what you claimed in March.
Files
src/documents.tsBy company and role. This is what you need before an interview.
Files
src/search.tsUpload the plain version somewhere that reports its extraction and record the outcome.
Files
docs/parsing-check.md
done when · tick each as it passeswatch out- Sending a tailored resume and not keeping it means arriving at an interview unable to remember what you claimed, which is a bad position for reasons that have nothing to do with honesty. Keep every generated document with the record as it was at the time.
That is the whole plan for Enhancv. What it deliberately does not cover is below · check the gaps before you call it a replacement.
- Professional template design.
- Content guidance based on recruiter data.
- Any guarantee about a particular parsing system.
- Job board distribution.
- template design, content guidance, scoring, document rendering, and support
- proprietary recruiter data
- job-board distribution
- human coaching
- automated application networks
- A cover letter generated from the same record with the same validation
- A version comparison showing what changed between two tailored documents
- A plain text output for forms that ask you to paste rather than upload
Need the files? The project pack on the verdict page hands your agent the whole brief · more career.