theme.json is required, at the theme root. A directory containing one is a
theme root, for both publishing and git deploy detection.
theme.json
Listing fields
These become the theme’s marketplace listing.is_free is derived from price_cents == 0 and is not a field you set.
schema
The schema generation your theme is written against. An integer, at least 1.
Absent, wrong type, negative or fractional all resolve to 1 rather than
failing.
The gate is one-directional. A deployment newer than the theme is accepted. A
theme declaring a version higher than the deployment supports is rejected:
builder
Which editing surface merchants get. "full" or "simple".
full
Section tree, click-to-select on the canvas, SEO panel, nested block
editing. The default.
simple
One scrolling column of forms beside the preview. No section tree, no
click-to-select, no SEO panel.
simple resolves
to full. A typo cannot make a theme unpublishable.
builder is presentation only. Both shells call the same endpoints with the
same scopes, and the server does not read this value. It grants and restricts
nothing.
Use simple for a theme small enough that a section tree adds overhead, such as
a link-in-bio layout. See The builder.
version
The publish path does not read version. The published version comes from the
publish request, or the server bumps the patch of the highest existing clean
semver.
Related files
config/migrations.json renames things across a schema change so merchant
content survives:
config/migrations.json
setting_renames is keyed by the post-rename section type.