@shotstack/cli 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shotstack/cli",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Command-line interface for the Shotstack video rendering API.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/shotstack/shotstack-cli",
@@ -13,7 +13,9 @@ license: Apache-2.0
13
13
 
14
14
  This skill loads in **terminal-based AI agents** (Claude Code, Cursor, Codex CLI, Gemini CLI, etc.). All operations here are shell commands. There is no embedded UI, no iframe, no inline canvas, no MCP tool surface — only `shotstack` invocations from a terminal. To hand off to a human, run `shotstack studio <file>`; this opens the user's default browser to a `shotstack.studio` URL. Tell the user to click Render *in the browser tab*, not in any UI inside the terminal.
15
15
 
16
- Commands for the Shotstack video rendering API. `render` submits an Edit JSON and returns a render ID; `status` polls a render until done. `ingest` uploads your own local files (or fetches remote URLs) and hosts them so they can be referenced from an Edit. `validate` lints an Edit — run it before every render. `studio` opens an edit in the browser editor for a human to preview, tweak, and render.
16
+ **Open-ended first render? Ask before composing.** If the ask doesn't state what the video is (subject, format or destination) — e.g. "render my first video", "make me a video", "set up Shotstack" — read [`references/onboarding.md`](references/onboarding.md) and ask its discovery questions, then WAIT for answers. Do not write an Edit first. An open-ended ask is not a specification, and a stray JSON file in the project doesn't make the user experienced. Compose without asking only when the user has stated what the video is, or explicitly says to just show anything.
17
+
18
+ Commands for the Shotstack video rendering API. `render` submits an Edit JSON and returns a render ID; `status` polls a render until done. `ingest` uploads your own local files (or fetches remote URLs) and hosts them so they can be referenced from an Edit. `validate` lints an Edit — run it before every render. `studio` opens an edit in the browser editor for a human to preview, tweak, and render. `template list|get|create|update|delete` reads and writes templates saved to the account: `list` shows saved templates (id + name); `get <id>` fetches a saved template's Edit JSON (e.g. one the user designed in Studio) so you can render or remix it; `create <file> --name <name>` saves an edit as a new template; `update <id> <file>` overwrites one; `delete <id>` removes one.
17
19
 
18
20
  **Default loop — no API key required:** compose → `validate` (offline lint) → `studio` (browser preview). Only the API-backed commands (`render`, `status`, `ingest`) need a key. Reach for `render` when you specifically need a final MP4 exported in the cloud; reach for `studio` for everything else — it is the cheapest way to see an edit and the right default for any creative a human will review.
19
21
 
@@ -151,6 +153,7 @@ Authoritative sources, in order of preference:
151
153
 
152
154
  This skill ships sub-references for the gnarly bits:
153
155
 
156
+ - [`references/onboarding.md`](references/onboarding.md) — first-render discovery interview for new users: what to ask, and how answers map to a first Edit
154
157
  - [`references/ingest.md`](references/ingest.md) — uploading local files (and fetching URLs) so they can be used in an Edit: the upload→render workflow, `--watch`, status values, supported types
155
158
  - [`references/timeline.md`](references/timeline.md) — track layering, transitions, background music via audio assets
156
159
  - [`references/positioning.md`](references/positioning.md) — coordinate model, `position`/`offset` (fraction of frame, +y up), clip bounding box & `fit`, text sizing, transform order
@@ -21,6 +21,7 @@ Read [`html5.md`](html5.md) for the rules these obey. The non-negotiables:
21
21
  - **No `<canvas>`** — Studio capture serialises the DOM; canvas bitmaps come through empty. Use SVG or positioned DOM.
22
22
  - **No network.** gsap/anime/d3/lottie are preloaded; external `<script src>`, `fetch`, remote `<img>`, and remote fonts are all CSP-blocked — inline everything as `data:` URIs.
23
23
  - **Fonts:** `timeline.fonts[]` does **not** reach `html5` and remote `@font-face` is blocked. These snippets name a display font first but render in the `system-ui` fallback unless you inline the font as a `data:` `@font-face`.
24
+ - **Use unique element IDs for GSAP targets, not `:nth-child` or compound CSS selectors.** Studio preview doesn't resolve `.parent:nth-child(n) .child` patterns; `#id` works everywhere. When animating repeated elements (list rows, bars, cards), generate a unique ID per item (`id="row0"`, `id="bar0"`) rather than relying on structural selectors.
24
25
 
25
26
  Coordinates below assume a **1080×1920 vertical** canvas; adjust `offset` for other sizes.
26
27
 
@@ -0,0 +1,71 @@
1
+ # First render: discovery interview
2
+
3
+ **The gate: do not compose an Edit until the user has answered the questions
4
+ below (or explicitly said "just show me anything").** Setting up the CLI and
5
+ key can proceed; writing the video cannot.
6
+
7
+ "Render my first video" is not a specification. It says nothing about the
8
+ subject, the content, the format or where the video will go. Neither does
9
+ "set up Shotstack". If any of those are unstated, ask. A first video is only
10
+ useful when it matches what the user is actually trying to make, and a short
11
+ interview gets there faster than guessing.
12
+
13
+ Skip the interview only when the user has stated what the video is (e.g.
14
+ "make a 9:16 promo from the images in ./assets with the tagline X"), or has
15
+ declined to answer.
16
+
17
+ ## The interview
18
+
19
+ Ask conversationally, batched into one or two messages, and wait for the
20
+ reply. Skip any question the project already answers (e.g. a Next.js
21
+ e-commerce app full of product images answers question 2).
22
+
23
+ 1. **What should the video do?** Social clips, product or listing videos,
24
+ personalised outreach, in-app content, something else? Listen for the job,
25
+ not the feature.
26
+ 2. **What content or data exists?** Images, footage, audio or brand assets in
27
+ the project or at URLs; structured data (CSV, JSON, database, CMS) that
28
+ could drive repeated or personalised videos.
29
+ 3. **Where will the videos go?** Destination decides format: 9:16 for
30
+ TikTok/Reels/Shorts, 1:1 or 4:5 for feeds, 16:9 for YouTube/web. When in
31
+ doubt for social, default to 1080x1920 (9:16).
32
+ 4. **One video or many?** Both make fine first renders, but the composition
33
+ differs: pipelines should use merge fields from the start.
34
+
35
+ ## From answers to a first render
36
+
37
+ - Compose ONE Edit JSON that answers the four questions. Make it something
38
+ worth keeping, not a minimal demo.
39
+ - Use the user's real assets when they exist (host local files first:
40
+ `shotstack ingest upload <file> --watch`, then reference the returned URL).
41
+ If nothing is to hand, build from the Shotstack asset library
42
+ (`references/asset-library.md`) and motion-graphic snippets
43
+ (`references/html5-snippets.md`), matched to their stated use case.
44
+ - Use their brand where it exists: colours, fonts and logos from the project
45
+ or their site rather than an invented look. Follow the house motion
46
+ language (`references/motion.md`).
47
+ - If they chose "many": add merge fields (`{{ placeholder }}`) for the parts
48
+ that vary per video, and show one render with sample values.
49
+ - Loop: compose, then `shotstack validate`, then `shotstack render edit.json
50
+ --env stage --watch`.
51
+
52
+ ## Wrapping up
53
+
54
+ - Give two links, always: the rendered MP4 and a Studio link (`shotstack
55
+ studio <file> --no-open`, include the printed shotstack.studio URL). The
56
+ Studio link lets the user tweak the design in the browser without touching
57
+ JSON; say so.
58
+ - Describe what they have in plain terms: a reusable template, free stage
59
+ renders, the same JSON in production via `--env v1`, merge fields for the
60
+ parts that vary. Don't surface validator warnings or internal caveats
61
+ unless something is actually broken.
62
+ - End by offering to take the next step towards what they said in the
63
+ interview, concretely, not a generic list. They wanted a data-driven
64
+ pipeline: offer to wire the template to their data source and render a
65
+ batch now. They mentioned their own footage: offer to upload it and swap it
66
+ in. One sharp offer beats five open-ended suggestions.
67
+
68
+ ## Tone
69
+
70
+ Brisk, concrete and curious about the user's project. Batch questions, don't
71
+ drip-feed. One good clarifying question beats three generic ones.
@@ -13,6 +13,7 @@ Common errors and the fix for each. **Catch most of them before rendering:** `sh
13
13
  - Timeline renders but layers are wrong
14
14
  - "Invalid asset URL"
15
15
  - html5 clip is blank but render succeeded
16
+ - html5 clip animates in the rendered MP4 but not in Studio preview
16
17
  - "Render failed" with no other detail
17
18
  - Render takes much longer than expected
18
19
  - Credits exhausted on stage environment
@@ -95,6 +96,17 @@ Two causes:
95
96
 
96
97
  A third variant: values stuck at `$0` or their initial state. This happens when `onUpdate` callbacks are used to mutate `textContent` — the seek harness doesn't fire `onUpdate`, so the DOM never updates. Bake final values into the HTML and animate opacity/transform instead. See `references/html5.md` → "The browser harness".
97
98
 
99
+ ## html5 clip animates in the rendered MP4 but not in Studio preview
100
+
101
+ Studio preview and the cloud render use different capture mechanisms. The cloud render (puppeteer) properly handles all GSAP properties; Studio's client-side preview does not. This is a parity gap, not a render bug — the MP4 is the ground truth.
102
+
103
+ Known differences:
104
+
105
+ - **`:nth-child` and compound CSS selectors** as GSAP targets don't resolve in Studio preview. `.brow:nth-child(1) .bar` silently matches nothing; rows and bars stay in their initial state. Use unique element IDs (`#row0`, `#bar0`) instead — they work in both.
106
+ - **`scale` / `scaleX` / `scaleY` transforms** don't animate in Studio preview. Elements starting at `scale(0)` or `scaleX(0)` stay invisible. Use `width` (for bars), `opacity`, or `y` transitions instead.
107
+
108
+ If a clip looks wrong in Studio but the rendered MP4 is correct, don't waste credits re-rendering — check whether the JS uses structural selectors or scale transforms, and swap for ID-based targets and width/opacity animations.
109
+
98
110
  ## "Render failed" with no other detail
99
111
 
100
112
  `shotstack status <id> --output json` returns the full response including the error message. The `--watch` text view truncates.