The Builder page (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/CristianParadaLopez/cv-builder/llms.txt
Use this file to discover all available pages before exploring further.
/builder) is a four-step wizard that collects every piece of information your CV needs before handing it off to the AI. Each step focuses on a different section of your CV, and you can move freely between steps — your progress is automatically saved to localStorage after every keystroke so nothing is lost if you refresh or accidentally navigate away.
Step 1 — Design: Choose your template and mode
The first step is handled by the
TemplateSelector component. You choose two things here:- CVStyle — the visual layout for your CV. The four available styles are
moderno,clasico,minimalista, andcreativo. Each is described in detail in the Templates guide. - CVMode — how the AI renders the output. Choose
designedfor a visually styled CV with colors, sidebars, and photos, oratsfor a plain single-column layout optimized for automated parsers. See the ATS Mode guide for a full breakdown.
Step 2 — Personal Data: Your contact information and summary
This step collects your core identity fields. The following fields are available:
The photo upload field uses the
| Field | Required | Notes |
|---|---|---|
name | ✅ Yes | Full name, max 100 characters |
email | ✅ Yes | Must be a valid email address |
phone | ✅ Yes | Format: +503 7000-0000, must match /^[+]?[\d\s\-()]{8,20}$/ |
location | ✅ Yes | City and country, e.g. San Salvador, El Salvador |
title | ✅ Yes | Your professional job title or role |
summary | ✅ Yes | A 3–4 line professional profile, max 500 characters |
photo | No | Optional profile photo, uploaded as a base64-encoded string |
PhotoUpload component. In ats mode the photo field is hidden automatically — photos are never included in ATS output even if one was previously uploaded.Step 3 — Experience & Education: Your professional history
Step 3 collects two required sections and three optional ones.Work Experience — add up to 5 entries. Each entry contains:
company— employer name (required)position— job title or role (required)startDate— formatted asYYYY-MM, e.g.2022-03(required)endDate—YYYY-MMformat or"Presente"if currently employed (required)description— responsibilities and achievements, max 1,000 characters (required)
institution— name of the school or university (required)degree— title or program name (required)startDate— four-digit year (required)endDate— four-digit year (required)
- Certifications (up to 5):
name,institution,date(month input),url(optional link),expires(optional),description(optional) - Volunteer Work (up to 5):
organization,role,startDate,endDate,description - Projects (up to 5):
title,description,url(optional),tech[](comma-separated technologies)
Step 4 — Skills: Technical and language proficiencies
The final step collects three arrays of plain strings:
skills[]— soft and professional skills (e.g. “Liderazgo”, “Comunicación”), up to 10 entries, each max 50 characterstools[]— software tools and technologies (e.g. “React”, “Figma”, “Microsoft Excel”), up to 10 entrieslanguages[]— spoken languages with proficiency level (e.g. “Inglés B2”, “Español nativo”), up to 5 entries
handleGenerateWithSuccess in the Builder, which triggers POST /api/cv/generate with your full form data, style, and mode. While the AI processes your request a full-screen loading overlay is shown. On success, the Builder transitions to the result view and displays your rendered CV in the CVPreview component.How form data persists
Skillara AI uses two hooks to ensure you never lose your work:useCV— manages the generated HTML, loading state, error state, and the selectedCVStyle. It exposeshandleGenerate(callsPOST /api/cv/generate) andhandleEdit(callsPOST /api/cv/edit).usePersistCV— writes your form data tolocalStorageunder the keyskillara_cv_form_dataon every change. The generated HTML is stored underskillara_cv_html. Both entries expire after 30 days. IflocalStorageis full (e.g. the HTML is very large), the hook automatically falls back tosessionStoragefor the HTML.
/builder, usePersistCV rehydrates the form so your previous answers are pre-filled.
Input validation and sanitization
Before the form submits,CVForm runs two layers of protection from utils/validation.ts:
sanitizeInput— strips<,>,javascript:prefixes, andon*=event handler attributes from every text field to prevent XSS injection. It also normalizes all quote characters to a single quote.validateFormData— checks required fields, email format (/^[^\s@]+@[^\s@]+\.[^\s@]+$/), phone format (/^[+]?[\d\s\-()]{8,20}$/), field length limits, and character allowlists. Errors are displayed in a summary banner at the top of the form with links to the offending fields.
sanitizeFormData runs a final .trim() across all string fields before the data is sent to the API.
Submitting and viewing results
Clicking Generar CV con IA on Step 4 callsPOST /api/cv/generate with the following JSON body:
{ "html": "<string>" }. The Builder stores this HTML in state and in localStorage, then transitions to the result view. From there you can:
- Edit the CV using the
PromptBarwith natural language instructions - Download a PDF by clicking Descargar PDF
- Save the CV to your account by clicking Guardar CV (requires login)
- Go back to any step to adjust your data and regenerate