Build Enhancv

YESreplaces $24.99/mosaves $299.88/yrback to the verdict

0%0 of 20 items done

Saved on this device only. Tick prerequisites first, then work the phases in order · do not start one until the checks above it pass.

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.

estimated effort weekendthe files for this build are in the project pack

RuntimeTypeScript with Vite, running locallySourceOne structured record, several outputsLayoutComputed from content, not positioned by handOutputPDF with real text, generated from the same source for both versionsVerificationExtract text from your own output and check the order

Before step 1

Everything below is assumed from the first step. Tick each one when you actually have it, not when you plan to.

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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.

VariableNeededExampleWhere the value comes from
RECORD_PATHrequired./data/record.jsonYour experience record. Private, and worth backing up.
DOCUMENTS_DIRrequired./data/documentsGenerated PDFs with their record snapshots.
MIN_FONT_PTrequired9.5Below this the layout reports overflow instead of shrinking.
TARGET_PAGESrequired2Page target. Exceeding it suggests cuts rather than shrinking type.
MODEL_PROVIDERrequiredlocalWhich adapter tailoring uses. Local means your history stays on the machine.

The build, in order

  1. The record, written once

    Everything you might claim exists in one place, in your own words.

    1. Real dates, your own wording, metrics only where you can support them.

      Files src/record.ts

    2. A skill references the entries that demonstrate it. Unsupported skills are flagged.

      Files src/skills.ts

    3. Readable Markdown, so it outlives this tool.

      Files src/export.ts

    done when · tick each as it passes
    watch 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.
  2. A document that parses correctly

    The plain version's extracted text comes out in reading order.

    1. Standard headings, real text, no graphics carrying information.

      Files src/templates/plain.ts

    2. With a text extraction tool, as an automated check rather than a manual one.

      Files src/verify-extraction.ts

      terminal
      pdftotext -layout plain.pdf -
    3. Generating a document runs the extraction check and reports the result.

      Files src/generate.ts

    done when · tick each as it passes
    watch 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.
  3. The designed version, and saying which is which

    You get a document that looks good, and you are told where to send each version.

    1. From the same record. Columns and hierarchy, accepting the extraction cost.

      Files src/templates/designed.ts

    2. Side by side. The comparison is the information the user needs.

      Files src/verify-extraction.ts

    3. With 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 passes
    watch 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.
  4. Tailoring that cannot invent

    A version targeted at a role rearranges what you did and adds nothing.

    1. Against the description. Selection is most of tailoring and needs no model.

      Files src/tailor.ts

    2. Constrained to the bullet's own content. Ask for structured output naming the source entry.

      Files src/rephrase.ts

    3. A pure function, unit tested with a crafted unsupported line.

      Files src/validate.tssrc/validate.test.ts

    done when · tick each as it passes
    watch 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.
  5. Length, which is a decision rather than a font size

    Fitting a page means cutting something, not shrinking the type.

    1. Below it the document reports overflow. This is the rule that keeps output readable.

      Files src/layout.ts

    2. Least relevant to the target role first. The suggestion is the useful part.

      Files src/trim.ts

    3. Removing a suggestion should actually bring it within the target.

    done when · tick each as it passes
    watch 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.
what this build does not replace
after v1, if you want it

Need the files? The project pack on the verdict page hands your agent the whole brief · more career.