Manifest reference
manifest.json is a UTF-8 JSON object. It is signed as exact bytes and cannot exceed 65,536 bytes. Reformatting it after signing invalidates the release.
Use manifest.schema.json for editor completion and CI. The production validator remains authoritative where JSON Schema cannot express byte-length rules.
Complete example
{
"schema_version": 1,
"protocol_version": 1,
"namespace": "acme/featured-products",
"version": "1.0.0",
"name": "Featured products",
"description": "Show selected storefront products and add them to the cart.",
"entrypoint": "index.html",
"capabilities": [
"site.theme.read",
"catalog.products.read",
"cart.manage"
],
"properties": {
"heading": {
"type": "text",
"label": "Heading",
"default": "Featured products"
}
}
}
Schema version 1 rejects unknown top-level fields, including $schema. Configure your editor to associate manifest.schema.json with files named manifest.json instead of adding a schema field to the release manifest. The scaffold already uses a valid release manifest.
Required fields
| Field | Rule |
|---|---|
schema_version |
Integer 1. |
protocol_version |
Integer 1. |
namespace |
Exact publisher-slug/package-slug. Immutable after registration. |
version |
Semantic version such as 1.2.0 or 2.0.0-beta.1. |
name |
1 to 120 UTF-8 bytes. |
entrypoint |
Relative .html path inside runtime/. |
capabilities |
A list of up to 32 known capability keys. Use [] when none are needed. |
properties |
An object containing up to 64 visual controls. Use {} when none are needed. |
Optional fields
| Field | Rule |
|---|---|
description |
Up to 500 UTF-8 bytes. Describe the visible outcome. |
Unknown fields are rejected.
Property controls
Every property definition requires type and label. Supported types are boolean, color, image, number, select, text, textarea, and url.
| Field | Applies to | Rule |
|---|---|---|
type |
All | One supported type. |
label |
All | 1 to 100 bytes. |
default |
All | Must match the property type. |
required |
All | Boolean. |
help |
All | Up to 300 bytes. |
options |
select |
1 to 100 unique {label, value} objects. |
min, max |
number |
Numeric bounds. min cannot exceed max. |
Property names begin with a lowercase letter and contain only letters, numbers, and underscores. They can be at most 64 characters.
Runtime setting limits are 500 bytes for text and select values, 4,096 bytes for textarea values, and 2,048 bytes for image and URL values. Colors use six- or eight-digit hex notation. URL and image values may be empty, site-relative, http, or https URLs. Full URLs require a valid DNS name or IP address and cannot contain credentials. A required string property cannot have a blank default. All defaults together cannot exceed 16,384 JSON-encoded bytes.
Properties are public. Never put secrets, tokens, customer information, or private configuration in a default or setting.
Capabilities
The closed capability list is documented in Runtime API and represented exactly in contract.json. Declaring a capability only asks for access. New permissions are off until the store user approves them.
Adding a capability in a later release triggers another permission review. Removing a capability automatically removes the obsolete grant.
Entrypoint and bundle
The ZIP contains exactly one HTML file, and it must be the declared entrypoint. Paths are relative, case-distinct only once, and limited to safe ASCII path segments. Symlinks are rejected.
The entrypoint cannot contain:
- inline JavaScript;
- inline event handlers;
- authored Content Security Policy headers;
- frames, objects, embeds, or applets;
- remote or missing module scripts.
The platform injects its own base URL, parent origin, and runtime module at launch.