Skip to main content
blog.json sits at the root of your site folder. Every setting is optional except name, and the whole file is optional too, so without it the site builds with the defaults below and the site name from the dashboard.

JSON Schema

Start the file with $schema to get autocomplete and inline errors in VS Code, Cursor, Zed and JetBrains editors:
blog.json
Notra publishes the schema at usenotra.com/schemas/blog.json (JSON Schema draft 2020-12), and you can also use it to validate the file in CI or generate types:

Validation

Every build checks blog.json before it builds anything, and mistakes stop the build, with the deployment log and the GitHub check naming the setting and what to change:
  • Notra ignores an unknown top-level setting with a warning that suggests the closest match, like Unknown setting "navBar" is ignored. Did you mean "navbar"?.
  • Unknown keys inside authors, integrations and security stop the build, because a typo there would silently turn something off.
  • Notra ignores other unknown nested keys.
The tables below use these shared formats:

Site

Design

See Design and CSS. See Logo, navigation and banner. Link labels are up to 60 characters.

Blog

See Layouts.

Changelog

Authors

authors is an object of author id → author. See Authors.

SEO

See SEO, share images and redirects.

Redirects

redirects is a list of up to 500 rules. See Redirects.

Variables

variables is an object of name → value, used as {{ name }} in posts. See Variables. Names start with a letter and use letters, digits, _ and -, up to 40 characters, and values are up to 500 characters. Variables also work in description, banner.content and the title and description of blog and changelog.

Integrations

See Analytics and scripts.

Security

See Content-Security-Policy.

Full example

blog.json
Last modified on October 8, 2026