Project format v1
The bundled JSON Schema defines all fields
and numeric limits. jamshoot init copies it beside project.json for offline
editor completion; runtime validation always uses the bundled version.
Minimal project
Create assets/screenshot.png inside the project folder before using this example:
{
"$schema": "./project.schema.json",
"version": 1,
"project": {"name": "Example App"},
"targets": ["appstore.mac.1280x800"],
"locales": ["en-US"],
"defaults": {"layout": "auto", "pattern": "dots", "seed": "launch"},
"slides": [{
"id": "overview",
"copy": {"en-US": {"headline": "Your app at a glance"}},
"assets": {"mac": "assets/screenshot.png"}
}]
}
| Field | Meaning |
|---|---|
version |
Integer 1 |
project |
Required nonblank name; optional local icon |
targets |
Unique IDs from jamshoot catalog, or custom.<width>x<height> (64–8192 px per side, at most 24 million pixels) |
locales |
Unique languages, preferably locale codes such as en-US; each is also an output folder name, so /, : and similar characters are rejected, as are case-insensitive duplicates |
defaults |
Required layout, pattern, seed, plus optional appearance settings |
slides |
1–10 slides, each with a unique id, localized copy, assets, optional display name and appearance style |
variants |
Optional nonempty list of {id, ...appearance overrides}; omission means one variant named default |
colorStyles, layoutStyles |
Optional libraries of named project palettes and layout templates |
Keys are camelCase. IDs start with a lowercase letter, contain lowercase letters, digits or hyphens, and have at most 64 characters. Windows reserved names are rejected. Unknown configuration properties, duplicate JSON keys, NaN and Infinity are errors.
Languages and screenshots
Every slide needs a nonblank copy[locale].headline for each project language.
subtitle and featureLabel (eyebrow) are optional. Text is never translated or
borrowed from another language.
Assets map a platform (mac, iphone, iphone-duo, ipad, custom) to a path
shared by all languages, or a locale/path map:
{"iphone": {"en-US": "assets/en.png", "ru": "assets/ru.png"}}
All sizes of a platform share its screenshot. Duo uses iphone-duo, and all custom
sizes use custom. Paths must be relative, use /, and refer to existing
PNG/JPEG/WebP files inside the project. URLs, absolute paths, .. and symlinks
escaping the project are rejected.
A draft may have assets: {} or an incomplete locale map. Studio can save and
preview it; plan returns "source": null for missing screenshots. validate,
render and Studio export require every selected platform/language screenshot.
Appearance
Effective style = built-in values → project defaults → variant → slide style.
Slide appearance applies across languages, targets and variants. Remove an
override to inherit again. Colors, gradient, pattern settings and layout settings
merge per field; typography merges per text field and setting. Arrays such as
gradient stops and glows replace the inherited array.
| Field | Use |
|---|---|
layout |
auto chooses window-top for Mac and device-top otherwise; window-top requires Mac; device-top and device-focus draw a device mockup; raw fills the output with a centered crop and draws no text or background |
colors |
Partial #RRGGBB values: top, bottom, accent, text, muted, frame |
gradient |
kind: linear, radial, solid; angle, or radial centerX, centerY, radius; midpoint; optional 2–8 {color, position} stops |
pattern, seed |
none, dots, circles, waves, diagonal, grid, confetti, arcs, mesh, crosshatch, chevrons, hexagons, stars or checkerboard; any seed text repeats one arrangement |
patternSettings |
density, opacity, scale, rotation, strokeWidth and wave amplitude |
deviceFrame, screenshotFit |
black, silver, none; contain keeps the screenshot, cover crops its center |
layoutSettings |
topMargin, labelGap, subtitleGap, screenshotGap, screenshotTop, bottomMargin (% of canvas height); textWidth, screenshotWidth (% of canvas width) |
typography |
Per featureLabel, headline, subtitle: font family, size (% of canvas height), weight, lineHeight (% of size), letterSpacing (% of size), uppercase; unset values use the layout's built-in text |
labelStyle |
text or badge eyebrow |
glows |
Up to eight {x, y, radius, color, opacity, blur} lights; edit in JSON; [] disables inherited glows |
For example, a slide can override only its headline size and pattern:
"style": {"typography": {"headline": {"size": 5}}, "pattern": "waves"}
Palettes contain id, name, all six colors, and optional gradient.
Layout templates contain id, name, layoutSettings. Reference them with
colorStyle or layoutStyle in defaults, variants or slide style. A reference
restarts its value groups from that saved definition, then applies explicit
overrides. Omit the reference to inherit; null resets the group to built-in
values before local overrides. Studio preserves linked values when deleting a
definition. Without a palette or colors, the built-in Ocean colors apply. Studio's
starter palettes are copied into colorStyles when chosen, so a project never
depends on them.
Output matrix
Files expand in configuration order: variant → locale → target → slide. Each combination produces one PNG, with its slide's 1-based position in the name:
{variant}/{locale}/{target}/{position}-{slide-id}.png
default/en-US/appstore.mac.1280x800/01-overview.png
Use jamshoot plan project.json --json to inspect the resolved settings, sources
and paths before rendering. See CLI for batch limits,
Rendering for image/font requirements and the
glossary for how editor labels map to these keys.