CLI

Install as described in Install. Every command has --help.

jamshoot init ./screenshots --json
# Replace screenshots/assets/screenshot.png with your app screenshot.
jamshoot validate ./screenshots/project.json --json
jamshoot plan ./screenshots/project.json --json
jamshoot render ./screenshots/project.json --out ./output --json
Command Behavior
catalog Lists the built-in sizes: target IDs, platforms, dimensions and App Store display groups. It does not check that a submission is complete
init DIR Creates the new folder DIR with project.json, a copy of the schema and a 1440×900 Mac placeholder screenshot
validate FILE Checks structure, IDs, targets, text, referenced files and required screenshots. It does not decode images or lay out text
plan FILE Lists every output file with its resolved settings, without rendering. Missing screenshots appear as "source": null; named fonts must resolve
render FILE --out DIR Renders RGB PNGs and manifest.json into the new folder DIR, whose parent must exist. Needs every screenshot
studio [FILE] Starts the browser editor; needs the web extra. See Studio

Text is laid out only when rendering: text that does not fit fails render (and Studio's preview and export), not validate or plan. render reads project.json from disk; Studio's Export PNGs renders the unsaved draft.

plan, render and studio refuse more than 1000 output files; raise the limit with --max-files N. The count is slides × sizes × languages × variants; nothing is skipped. Output paths are described in the project format.

JSON output and exit codes

With --json, each command writes one JSON document to stdout. Exit code 0 means success. A project or file error exits with 1 and prints {"error": {"code": "invalid_project", "message": "..."}}; without --json the message goes to stderr. Invalid arguments exit with 2 and argparse's message on stderr. Option abbreviations are not accepted; studio has no --json.

init returns {"project": "/abs/path/project.json"}. validate returns {"valid": true, "project": "...", "version": 1}. catalog returns the catalog with targets and displayGroups. plan returns every output file:

{
  "version": 1,
  "fileCount": 1,
  "files": [{
    "slide": "overview", "variant": "default", "locale": "en-US",
    "target": "appstore.mac.1280x800", "platform": "mac", "width": 1280, "height": 800,
    "output": "default/en-US/appstore.mac.1280x800/01-overview.png",
    "source": "/abs/path/assets/screenshot.png",
    "headline": "Your app at a glance",
    "layout": "window-top", "pattern": "dots", "seed": "launch",
    "deviceFrame": "black", "screenshotFit": "contain", "labelStyle": "text"
  }]
}

render returns the manifest it writes to DIR/manifest.json:

{
  "version": 1,
  "rendererVersion": "1.0.0",
  "catalogVersion": 1,
  "fileCount": 1,
  "files": [{
    "slide": "overview", "variant": "default", "locale": "en-US",
    "target": "appstore.mac.1280x800", "width": 1280, "height": 800,
    "output": "default/en-US/appstore.mac.1280x800/01-overview.png",
    "sha256": "5bcc7978…"
  }]
}

Studio options

jamshoot studio --open
jamshoot studio --home ./workspace --port 0 --open
jamshoot studio ./screenshots/project.json --out ./export-01 --open
Option Effect
--open Opens the browser
--port N Port on 127.0.0.1; default 8765, 0 picks a free one
--home DIR Uses DIR/projects and DIR/trash for this run
--fallback-home DIR Studio folder when no --home, JAMSHOOT_HOME or saved setting chooses one
FILE, --out DIR Also opens FILE in place; --out sets its export folder
--max-files N Output file limit for preview and export

Environment variables

Variable Effect
JAMSHOOT_HOME Studio folder
JAMSHOOT_SETTINGS Location of Studio's settings file
JAMSHOOT_FONT TTF, OTF or TTC file for text without a named font
JAMSHOOT_FONT_DIRS Font folders to search instead of the system ones, separated like PATH