# Resume to JSON

Paste a plain-text resume and get a JSON Resume (v1.0.0) document — or validate an existing resume.json against the schema. Runs in your browser.

## Run it

- **CLI:** `gizza tool resume-to-json "Jane Doe
Senior Software Engineer
San Francisco, CA | jane.doe@example.com | (555) 123-4567 | linkedin.com/in/janedoe

Experience

Senior Software Engineer — Acme Corp
Jan 2020 – Present
- Led migration to a service mesh across 40 services"`
- **Web:** https://gizza.ai/tools/resume-to-json/
- **Agents:** machine-readable descriptor (parameters JSON Schema) at https://gizza.ai/tools/resume-to-json/tool.json

## Inputs

- `data` — Resume text or resume.json _(field)_
- `mode` — Mode _(field)_
- `schema_ref` — Include $schema reference and meta.version _(field)_
- `pretty` — Pretty-print (indent) the JSON _(field)_

## Output

- JSON (text)

## Query parameters

Open the tool pre-filled and auto-run via URL:

- `data` — Resume text or resume.json
- `mode` — Mode
- `schema_ref` — Include $schema reference and meta.version
- `pretty` — Pretty-print (indent) the JSON

Example: `https://gizza.ai/tools/resume-to-json/?data=Jane%20Doe%0ASenior%20Software%20Engineer%0ASan%20Francisco%2C%20CA%20%7C%20jane.doe%40example.com%20%7C%20%28555%29%20123-4567%20%7C%20linkedin.com%2Fin%2Fjanedoe%0A%0AExperience%0A%0ASenior%20Software%20Engineer%20%E2%80%94%20Acme%20Corp%0AJan%202020%20%E2%80%93%20Present%0A-%20Led%20migration%20to%20a%20service%20mesh%20across%2040%20services&mode=auto&schema_ref=true&pretty=true`

---

## About this tool

This tool converts a pasted resume into the standard **JSON Resume** format — the open
v1.0.0 schema used by resume builders, themes, and registries — and can also **validate**
an existing `resume.json` document against that schema. Everything runs locally in your
browser; the resume text never leaves your machine.

**Extract** reads the resume the way a human skims it: the header block becomes `basics`
(name, label, email, phone, URL, location, and LinkedIn/GitHub/Twitter/GitLab/Stack
Overflow/Medium/Dribbble/Behance links as `profiles`), and recognized section headings —
Experience, Education, Skills, Projects, Languages, Awards, Certifications, Publications,
Volunteer, Interests, References, Summary — become the matching schema sections. Date
ranges like `Jan 2020 – Present`, `03/2021`, or `2016 – 2019` are normalized to the
schema's ISO-8601 partial dates (`YYYY`, `YYYY-MM`, or `YYYY-MM-DD`), with an open
`endDate` for "Present". Bullets become `highlights`, grouped skill lines like
`Languages: Rust, Python` become `{name, keywords}` entries, and `English (Native)`
becomes `{language, fluency}`. Empty sections are omitted, and only canonical schema
field names are emitted, so the output drops straight into any JSON Resume theme or CLI.

**Validate** checks a pasted `resume.json` and returns a report:
`{valid, errors, warnings, summary}`. Type mismatches and malformed dates are errors;
suspicious email/URL formats and unknown keys are warnings (the schema allows extra
fields, but most tools ignore them). The default **Auto-detect** mode validates when the
input is a JSON object and extracts otherwise.

### Worked example

Pasting this resume text:

```text
Jane Doe
Senior Software Engineer
San Francisco, CA | jane.doe@example.com | linkedin.com/in/janedoe

Experience

Senior Software Engineer — Acme Corp
Jan 2020 – Present
- Led migration to a service mesh across 40 services
```

produces this JSON Resume document:

```json
{
  "basics": {
    "name": "Jane Doe",
    "label": "Senior Software Engineer",
    "email": "jane.doe@example.com",
    "location": { "city": "San Francisco", "region": "CA" },
    "profiles": [
      {
        "network": "LinkedIn",
        "username": "janedoe",
        "url": "https://linkedin.com/in/janedoe"
      }
    ]
  },
  "work": [
    {
      "name": "Acme Corp",
      "position": "Senior Software Engineer",
      "startDate": "2020-01",
      "highlights": ["Led migration to a service mesh across 40 services"]
    }
  ]
}
```

### Limits and edge cases

- Input is capped at **1 MiB** of text; larger input is rejected with an error.
- Extraction is a **heuristic, rule-based parser for English section headings** (plus
  common variants like "Employment History" or "Core Competencies"). It is not a machine
  learning model: unusual layouts, tables, multi-column text, or non-English headings may
  land in the wrong section — review the output before publishing it.
- Paste **plain text only**. PDF and Word files must be converted to text first (copy
  and paste from the document works well); this tool does not do OCR.
- Extracted output is schema-valid by construction; a "Present"/"Current" end date is
  represented by omitting `endDate`, exactly as the schema expects.
- In validate mode the input must be a JSON **object**; a JSON array, string, or broken
  JSON returns an error that points at the problem.

## FAQ

<details>
<summary>What is the JSON Resume schema?</summary>

JSON Resume is an open standard that stores a resume as a single JSON document with
well-known sections: `basics`, `work`, `volunteer`, `education`, `awards`,
`certificates`, `publications`, `skills`, `languages`, `interests`, `references`, and
`projects`. Because the shape is standardized, one `resume.json` file can be rendered by
many independent themes, builders, and command-line tools. This tool targets schema
version **v1.0.0** and emits only its canonical field names.

</details>

<details>
<summary>How accurate is the extraction?</summary>

It is a deterministic, rule-based parser — not an AI model. It recognizes the common
resume conventions: a header block with name, title, and contact links; section headings
like "Experience" or "Technical Skills"; `Role — Company` entry lines; date ranges in
`Jan 2020 – Present`, `03/2021`, and `2016 – 2019` styles; and bullet lists. Clean,
conventionally formatted resumes extract very well; creative layouts may need a manual
touch-up afterwards. The output is always structurally valid JSON Resume, so anything
that needs fixing is a copy edit, not a schema repair.

</details>

<details>
<summary>What is the difference between errors and warnings in validation?</summary>

Errors are violations of the schema's hard constraints: a field with the wrong JSON type
(for example `basics.name` as a number, or `skills[0].keywords` as a string instead of an
array) or a date that does not match the schema's ISO-8601 pattern (`YYYY`, `YYYY-MM`,
or `YYYY-MM-DD` — `"Jan 2020"` is an error). Warnings flag things that are technically
allowed but usually mistakes: an email or URL that does not look well-formed, and unknown
keys (the schema sets `additionalProperties: true`, but most renderers silently ignore
fields they do not know). `valid` is `true` when there are no errors.

</details>

<details>
<summary>Why is my start date missing or wrong?</summary>

Dates are read from each entry's header lines, and the first recognized date or date
range wins. Supported forms are `Month YYYY` (including abbreviations like `Sept. 2019`),
`Month DD, YYYY`, `MM/YYYY`, `YYYY-MM`, `YYYY-MM-DD`, and bare `YYYY`, joined by `-`,
`–`, `—`, or the word "to"; `Present`, `Current`, `Ongoing`, and `Today` mark an open
end. If an entry's dates sit inside a paragraph rather than on the title/subtitle lines,
move them next to the role line and re-run.

</details>

<details>
<summary>Can I turn the JSON back into a readable resume?</summary>

Yes — that is the point of the standard. Any JSON Resume-compatible theme, builder, or
CLI can render the extracted document to HTML or PDF, and structured-resume tools
(including a JSON-to-Markdown resume builder) accept the same shape. Tick "Include
$schema reference" to embed the official schema URL and a `meta.version` field so other
tools can identify the format immediately.

</details>

## Related tools

- [Avro to JSON Converter](https://gizza.ai/tools/avro-to-json/): Decode Apache Avro Object Container Files (.avro / OCF) to JSON, NDJSON, or the embedded schema — no .avsc needed, free and private in your browser.
- [Bencode decoder](https://gizza.ai/tools/bencode-decoder/): Decode bencode (the BitTorrent / .torrent serialization format) into readable JSON, and re-encode JSON back into canonical bencode — in your browser. Nothing is uploaded.
- [CAMT.053 Statement Parser](https://gizza.ai/tools/camt053-parse/): Parse a camt.053 (or camt.052/054) ISO 20022 bank statement XML into JSON or CSV in your browser: balances, dates, counterparties, references. No upload.
- [CSV Cell Diff](https://gizza.ai/tools/csv-cell-diff/): Compare two CSVs column-by-column and highlight every individual cell that changed, plus added and removed rows and columns.
- [Change CSV Delimiter](https://gizza.ai/tools/csv-change-delimiter/): Re-save CSV or delimited data with a different separator (comma, tab, semicolon, pipe) with correct requoting — in your browser. Free, private, no upload.
