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 ofsummary,experience,
education.
- Unknown fields are ignored, not errors.
- Missing list fields default to
[]; missing string fields default to"". - Dates:
YYYY-MMorYYYY. Use"Present"for a current role. - Plain ASCII quotes inside strings. Escape inner double quotes as \" .
requirementsis 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
| Field | Type | Notes |
|---|---|---|
schemaVersion | string | "1.0" |
targetJob | object | the role being applied for |
name | string | required |
headline | string | the title printed under your name |
contact | object | see below |
summary | string | 2–3 sentences, numbers where possible |
experience | array | see below |
education | array | see below |
skills | array | grouped keywords |
certifications | array | credentials |
projects | array | side projects, open source, portfolio |
languages | array | name + level |
references | array | named referees, or a single "available on request" entry |
requirements | array | met / 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."
}
]
}jsonField reference
targetJob
| Field | Type | Notes |
|---|---|---|
title | string | exact title from the advert |
company | string | hiring company |
location | string | city / remote |
url | string | link to the advert |
closingDate | string | YYYY-MM-DD or the advert's wording |
description | string | raw 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[]
| Field | Type | Notes |
|---|---|---|
company | string | |
position | string | |
location | string | optional |
startDate | string | YYYY-MM |
endDate | string | YYYY-MM or "Present" |
summary | string | optional single line of scope |
highlights | string[] | 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[]
| Field | Type | Notes |
|---|---|---|
text | string | the requirement, in the advert's words |
status | enum | exactly "met", "partial" or "not_met" |
evidence | string | optional, 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.