Files
rendercv/docs/developer_guide/json_schema.md
Sina Atalay 5cc5fbdf9e Massive Refactor: Architecture Redesign and Technical Debt Cleanup (#528)
* Rename `data` folder with schema

* Start refactoring data models

* Work on entry models

* Keep working on entries

* Keep working on data models

* Push old data files

* Keep working on data models

* First draft of schema.cv

* Keep working on schema

* Keep working on schema

* Improve schema.models

* Keep working on rendercv.schema

* Work on schema.design

* Keep working on rendercv.schema

* Complete variant_class_generator

* Keep working rendercv.schema

* Keep working on rendercv.schema

* Final touches to rendercv.schema

* Improve json schema descriptions in rendercv.schema

* Start working on rendercv.schema tests

* Keep implementing rendercv.schema tests

* Add more tests for rendercv.schema

* Improve rendercv.schema

* Improve docstrings and comments in rendercv.schema

* Implement better pydantic error handling in `rendercv.schema`

* Improve variant class system

* Fix rendercv.schema tests

* Start working on rendercv.templater

* Update template names

* Switching to new rendercv typst template soon

* Work on new templater

* Rename renderer with renderer_old

* Don't use utils in rendercv.schema

* Complete connections

* Update renderer folder structure

* Work on new renderer

* Work on new renderer

* Date processing on new renderer

* Improve date processing, support multiple emails, phones, and websites

* Improve markdown to Typst

* Complete entry template processing

* Time span computation in new renderer

* Better entry templates

* Setup new templates

* Improve rendercv.schema

* Start adding tests for rendercv.renderer

* New markdown parser!

* Improve markdown to typst conversion

* Finalize markdown parser

* Add new test files for rendercv.renderer

* Fix cv and connections

* Add connections test

* Improve connection tests

* Improve entry templates

* Add model processor tests

* Improve templater

* Rename old folders

* Improve schema

* Add file generation logic to renderer

* Fix naming issues

* Fix schema tests

* Add path type tests

* Add font family and typst dimension type tests

* Rename old tests

* Fix design tests

* Start integration testing of renderer

* Improve entry tempates

* Handle nested highlights properly

* Finalize Typst preamble template

* Start working on new CLI

* Remove old test files

* Implement override dictionary in new schema

* Start working on new CLI

* Better prints on render command

* New structure

* New render printer

* Add all the commands to new CLI

* Work on new command in new cli

* Improve new command

* Add error handler to new cli

* Work on create theme command

* Complete create theme command

* Remove old source files

* Improve exceptions

* Create new docs

* Add writing tests guide

* Fix cli printer and write tests

* Test copy templates

* Add app tests

* Bring back accidentally removed files

* Imporve cli and tests

* Fix path issues

* Improve

* Improve

* Add reference file comparison tests

* Fix path resolver

* Start working on test_pdf_png

* Implement comparison of multiple files (png)

* Start testing typst

* Fix templating issues

* Fix header and entry templates issues

* Implement short second rows

* Fix date issues

* Fix nested bullets and add summary

* Update testdata

* Implement footer

* Update testdata

* Reimagined design and locale schema, first iteration

* Reimagined design and locale second iteration

* Update design and locale schemas

* Adapt templater to the new design and locale

* Fix tests

* Update lib.typ and testdata for the new locale and design

* Implement proper tests with all combinations of entries

* Remove some docstrings

* fix connections logic

* Improve

* Start working on examples

* Update testdata

* Fix long second row issue

* fix templating issues

* Fix lib.typ issues

* Update testdata

* Fix clean_trailing_parts

* Update test cv

* update test cv

* Update theme defaults

* update schema and fix moderncv

* Fix moderncv issues

* Update testdata

* Update testdata and examples

* Fix issues about photo

* Fix typst photo path issues

* improve entry templates from yaml

* add new locale

* Rename writing tests doc

* Update writing tests

* Improve tests

* Add more cli tests

* Increase test coverage

* Rename variant pydantic model generator

* Improve tests

* Update testdata and improve tests

* Format, fix pre-commit errors

* Fix scripts and update entry figures

* Improve tests

* Write docstrings of schema

* Write schema docstrings

* Setup api reference

* Start working on new docs

* Work on docs

* Improve progress panel of render command

* Finalize new docs index

* Complete CLI docs

* Work on YAML input structure page

* Finalize user guide

* Start working on developer guide

* Improve api reference

* Improve developer guide

* Improve developer guide

* Improve developer gide

* Improve developer guide

* Improve developer guide

* Update developer guide

* Improve developer guide

* Improve developer guide

* Improve developer guide

* Developer guide first draft

* update developer guide

* Update examples

* Update testdata

* Handle wrong installation (rendercv instead of rendercv[full])

* Remove unnecessary files

* Write set up vs code page

* Update README.md

* Change docs description

* Compress design options gif

* minor updates

* Polish all the json schema descriptions

* Update testdata and examples

* Remove some emdashed from docs

* Add whatsapp support

* Add TestEscapeTypstCharacters to tests

* Implement custom connections

* Add page break before sections feature

* Revert page break before sections feature

* Rebase to main

* Fix social network tests, update schema
2025-12-09 17:03:56 +03:00

5.2 KiB

toc_depth
toc_depth
3

JSON Schema

The Problem

You've encountered this everywhere, even if you didn't realize it was the same problem:

VS Code settings (settings.json):

{
  "editor.fontSize": 14,
  "editor.tabSiz": 4  // ← Typo! VS Code highlights it red immediately
}

GitHub Actions workflows (.github/workflows/test.yaml):

on:
  push:
    branchs:  # ← Typo! Your editor underlines it, suggests "branches"
      - main

These files are completely different (VS Code settings, GitHub workflows). But you get autocomplete and validation in both. How?

VS Code doesn't just "know" what's valid in settings.json. GitHub Actions workflows don't magically get autocomplete.

Someone had to tell your editor: "Here are all the valid fields, their types, and what they mean."

That "someone" is JSON Schema.

What is JSON Schema?

JSON Schema is a standard way to describe the structure of JSON/YAML documents.

Think of it as a specification, a formal description of what's valid:

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Your full name"
    },
    "age": {
      "type": "integer",
      "minimum": 0,
      "description": "Your age in years"
    },
    "email": {
      "type": "string",
      "format": "email"
    }
  },
  "required": ["name"]
}

This schema says:

  • A valid document is an object
  • It must have a name field (string, required)
  • It can have an age field (non-negative integer, optional)
  • It can have an email field (string matching email format, optional)

Why does JSON Schema exist?

Because JSON and YAML files are everywhere: configuration files, API requests/responses, CI/CD workflows, application settings, data files. They all share the same problem:

How do you communicate what's valid?

You could write documentation: "The name field is required and must be a string. The age field is optional and must be a non-negative integer." But documentation is for humans to read, not machines.

JSON Schema is the same information in machine-readable format so editors can understand it.

Once your editor has a schema, it can provide autocomplete, catch typos, and show inline documentation as you type.

This is why:

  • Microsoft publishes a JSON Schema for VS Code settings: your editor fetches it and provides autocomplete
  • GitHub publishes a JSON Schema for Actions workflows: that's how you get field suggestions
  • Thousands of tools do the same: Kubernetes, Docker, Terraform, ESLint, package.json, tsconfig.json, the list goes on

JSON Schema is infrastructure for editor tooling.

RenderCV's JSON Schema

RenderCV has the same problem. Users write their CVs in YAML, and we want them to have a smooth editor experience with autocomplete, typo detection, and inline documentation.

Solution: Publish a JSON Schema for RenderCV YAML files.

JSON Schema of RenderCV

That's why schema.json exists in the repository. Same universal problem, same universal solution.

How the Schema is Generated

We don't write schema.json by hand. It's automatically generated from Pydantic models.

RenderCV's entire data structure is defined using Pydantic models (see Understanding RenderCV for details). Pydantic has a built-in feature: model_json_schema(), which generates JSON Schema from your models.

That's what src/rendercv/schema/json_schema_generator.py does. It calls model_json_schema() on our top-level model and writes the result to schema.json.

How Editors Know to Use RenderCV's Schema

There are two ways editors discover and use RenderCV's schema:

1. Manual Declaration

Add a special comment at the top of your YAML file:

# yaml-language-server: $schema=https://raw.githubusercontent.com/rendercv/rendercv/refs/tags/v2.4/schema.json

cv:
  name: John Doe

This tells the editor: "Use RenderCV's schema for this file." Note the version tag in the URL, which ensures you get the schema matching your RenderCV version.

Requirements: Your editor needs to support this. For VS Code, install the YAML extension.

2. Schema Store (Automatic)

RenderCV's schema is listed in SchemaStore, a central registry of schemas that most IDEs use.

In SchemaStore, RenderCV's schema is configured to automatically activate for files ending with _CV.yaml. This means:

  • If your file is named John_Doe_CV.yaml
  • And your editor uses SchemaStore (VS Code with YAML extension does)
  • You get autocomplete automatically, no comment needed

When is the Schema Generated?

During development, whenever data models change, run:

just update-schema

This runs scripts/update_schema.py, which regenerates schema.json.

Learn More