CV Sketch
Specification sheet // schema v1.0

The CV JSON schema

One object in, one finished CV out. This is exactly what the prompt asks an AI for, what the workspace validates, and what every template and export reads.

Open the workspace
Read this bit first

requirements is the only part that uses a fixed vocabulary: every entry needs status to be exactly "met", "partial" or "not_met". Anything else is rejected, and this array is never printed on the CV — it exists so you can see your gaps before you apply.

CV Sketch — CV JSON schema (v1.0)

CV Sketch turns one JSON object into a finished CV. This file is the contract: the prompt in Get the prompt asks an AI to produce exactly this, the Paste your JSON tab validates exactly this, and every template and export reads exactly this.

Rules

  • Required: name, plus at least one of summary, experience,

education.

  • Unknown fields are ignored, not errors.
  • Missing list fields default to []; missing string fields default to "".
  • Dates: YYYY-MM or YYYY. Use "Present" for a current role.
  • Plain ASCII quotes inside strings. Escape inner double quotes as \" .
  • requirements is a gap-check for you and is never printed on the CV,

in the PDF, or in the Word file.

Accepted aliases

Pasting existing JSON Resume output works: basics → name/headline/ contact/summary, work → experience, basics.profiles → linkedin/github/website, flat skills: ["React"] → one skill group.

Top level

FieldTypeNotes
schemaVersionstring"1.0"
targetJobobjectthe role being applied for
namestringrequired
headlinestringthe title printed under your name
contactobjectsee below
summarystring2–3 sentences, numbers where possible
experiencearraysee below
educationarraysee below
skillsarraygrouped keywords
certificationsarraycredentials
projectsarrayside projects, open source, portfolio
languagesarrayname + level
referencesarraynamed referees, or a single "available on request" entry
requirementsarraymet / partial / not_met
{
  "schemaVersion": "1.0",
  "targetJob": {
    "title": "Senior Product Designer",
    "company": "Northwind Payments",
    "location": "London, UK (Hybrid)",
    "url": "https://northwind.example/careers/senior-product-designer",
    "closingDate": "2026-11-15",
    "description": "Optional one-line summary of the role."
  },
  "name": "Alex Taylor",
  "headline": "Staff Product Designer",
  "contact": {
    "email": "alex.taylor@studio-sketch.io",
    "phone": "+44 20 7946 0812",
    "location": "London, UK",
    "website": "alextaylor.work",
    "linkedin": "linkedin.com/in/alextaylor",
    "github": "github.com/alextaylor"
  },
  "summary": "Two or three sentences aimed at this job, with real numbers.",
  "experience": [
    {
      "company": "Northwind Payments",
      "position": "Staff Product Designer",
      "location": "London, UK",
      "startDate": "2021-04",
      "endDate": "Present",
      "summary": "One line of scope (optional).",
      "highlights": [
        "Rebuilt the token pipeline, cutting handoff from 9 days to 5.",
        "Redesigned checkout for 135 currencies, lifting completions 2.4%."
      ]
    }
  ],
  "education": [
    {
      "institution": "Rhode Island School of Design",
      "studyType": "B.Sc.",
      "area": "Industrial & Interaction Design",
      "location": "Providence, RI",
      "startDate": "2011",
      "endDate": "2015",
      "score": "Magna Cum Laude",
      "highlights": []
    }
  ],
  "skills": [
    {
      "name": "Design & Research",
      "keywords": ["Design Systems", "Figma", "Design Tokens", "User Research"]
    }
  ],
  "certifications": [
    { "name": "NN/g UX Master Certification", "issuer": "Nielsen Norman Group", "date": "2021", "url": "" }
  ],
  "projects": [
    {
      "name": "PaperSketch Toolkit",
      "description": "Zero-dependency vector styling library for hand-drawn interfaces.",
      "url": "https://github.com/alextaylor/papersketch"
    }
  ],
  "languages": [
    { "name": "English", "level": "Native" },
    { "name": "German", "level": "C2" }
  ],
  "references": [
    {
      "name": "Dana Whitfield",
      "title": "VP Product",
      "company": "Northwind Payments",
      "email": "dana.whitfield@northwind.example",
      "phone": ""
    }
  ],
  "requirements": [
    {
      "text": "8+ years of product design experience",
      "status": "met",
      "evidence": "10+ years, three companies."
    },
    {
      "text": "Experience running quantitative research at scale",
      "status": "partial",
      "evidence": "48 moderated sessions and A/B tests; no in-house data-science pairing."
    },
    {
      "text": "Experience with an EU-regulated payments licence",
      "status": "not_met",
      "evidence": "Worked with risk and compliance, never owned a licence submission."
    }
  ]
}
json

Field reference

targetJob

FieldTypeNotes
titlestringexact title from the advert
companystringhiring company
locationstringcity / remote
urlstringlink to the advert
closingDatestringYYYY-MM-DD or the advert's wording
descriptionstringraw advert text is fine — never printed on the CV

contact

email, phone, location, website, linkedin, github — all strings, all optional. Whatever is present is printed as a dot-separated line under your name.

experience[]

FieldTypeNotes
companystring
positionstring
locationstringoptional
startDatestringYYYY-MM
endDatestringYYYY-MM or "Present"
summarystringoptional single line of scope
highlightsstring[]one achievement per bullet

education[]

institution (required), studyType, area, location, startDate, endDate, score, highlights.

skills[]

{ "name": "Group name", "keywords": ["...", "..."] }. A flat array of strings is accepted and becomes a single group.

certifications[]

{ "name", "issuer", "date", "url" } — only name is required.

projects[]

{ "name", "description", "url" } — only name is required.

languages[]

{ "name", "level" } — level is free text (Native, C2, Fluent).

references[]

{ "name", "title", "company", "email", "phone", "note" }. A single { "name": "Further references available on request." } entry is perfectly valid and prints as one line.

requirements[]

FieldTypeNotes
textstringthe requirement, in the advert's words
statusenumexactly "met", "partial" or "not_met"
evidencestringoptional, what supports or fails the claim

Anything not in this list is ignored. Anything in this list that is missing is simply not printed.

Privacy & storage

  • Signed out, your draft lives in your own browser (local storage) and is never

uploaded. The only time data leaves the device is when you press a download button, and then it is sent to this server purely to render the file.

  • Signed in, saved profiles live in a SQLite file on this server, tied to your

account. Passwords are stored as scrypt hashes, never in plain text, and session tokens are stored only as SHA-256 hashes.

  • Nothing is sent to a third-party AI provider by CV Sketch. You drive that part

yourself, in whichever chat window you choose.

  • Deleting a profile deletes its row and its stored JSON. There is no shadow

copy, and the JSON archive download gives you everything back at any time.