You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: plugins/droid-control/skills/capture/SKILL.md
+28-4Lines changed: 28 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -26,12 +26,29 @@ The command that invoked you should have provided:
26
26
Before recording anything:
27
27
28
28
- Terminal size is consistent across all sessions (`--cols 120 --rows 36`)
29
+
-**Browser viewport size matches the composition layout** (see "Browser viewport sizing" below) — mismatched aspects letterbox in the final video
29
30
- Branch/worktree paths and env vars are correct
30
31
- Recording format matches the driver: `.cast` for tuistory, `.mp4` for true-input, screenshots for agent-browser
31
-
- If comparing branches, both sessions use identical terminal dimensions and launch parameters
32
+
- If comparing branches, both sessions use identical terminal / viewport dimensions and launch parameters
32
33
- For `droid-dev` captures, `--repo-root` is **mandatory** — `tctl` will refuse to launch without it
33
34
-**Color env vars are set** (see below)
34
35
36
+
### Browser viewport sizing
37
+
38
+
Panel aspect ratio in the final composition is **layout-dependent**. At the default 1920×1080 output with factory preset margins, the window-chrome panels that clips render into come out roughly:
|`single`|~1760×920 (≈16:9 landscape) |**1280×720** or **1440×810**|
43
+
|`side-by-side`|~872×920 per panel (≈8:9, near-square / slight portrait) |**960×1000**, **900×1000**, or **1024×1080**|
44
+
45
+
Feeding a 16:9 landscape recording into a near-square side-by-side panel triggers `objectFit: "contain"` letterboxing — you get a thin strip of content with giant black bars above and below. Two ways to avoid it:
46
+
47
+
1.**Match aspects at capture time** (preferred) — pick the viewport from the table above based on the committed layout.
48
+
2.**Opt into cropping at compose time** — pass `"objectFit": "cover"` in showcase props. Crops the edges of the clip instead of letterboxing. Use when the relevant UI is centered and the clip's edges are expendable.
49
+
50
+
If you're unsure of the layout when capturing, default to `960×1000` — it is workable in both layouts (slight horizontal letterbox in `single`, no letterbox in `side-by-side`).
51
+
35
52
```bash
36
53
TCTL=${DROID_PLUGIN_ROOT}/bin/tctl
37
54
# RUN_ID and RUN_DIR should already be set by the parent (see droid-control ground rule 5)
Copy file name to clipboardExpand all lines: plugins/droid-control/skills/compose/SKILL.md
+21Lines changed: 21 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -108,6 +108,26 @@ Set the `speed` prop to hit the target: if the raw recording is 3 minutes and th
108
108
109
109
`.mp4`, `.webm`, and `.png` clips are passed through to Remotion unchanged except for staging into `public/`. Re-encode non-`.cast` clips manually only if their pixel format or dimensions are invalid.
110
110
111
+
### Clip aspect ratio (mandatory check for browser captures)
112
+
113
+
At the default 1920×1080 output with factory preset margins, panels come out roughly:
114
+
115
+
| Layout | Panel aspect |
116
+
|---|---|
117
+
|`single`|~1760×920 (≈16:9 landscape) |
118
+
|`side-by-side`|~872×920 per panel (≈8:9, near-square / slight portrait) |
119
+
120
+
`.cast` conversions target panel aspect automatically. **Pre-recorded `.mp4` / `.webm` clips do not** — if the clip aspect doesn't match the panel aspect, the clip will letterbox (with the default `objectFit: "contain"`) or crop (with `"cover"`).
121
+
122
+
**Common pitfall**: browser captures are typically 16:9 landscape (e.g. 1280×720). Dropped into a `side-by-side` layout they render as a thin band with giant black bars above and below.
123
+
124
+
Two fixes, in priority order:
125
+
126
+
1.**Re-capture at a panel-friendly viewport** — go back to the capture stage and set viewport to ~960×1000 for `side-by-side`, ~1280×720 for `single`.
127
+
2.**Pass `"objectFit": "cover"` in props** — crops the clip edges to fill the panel. Acceptable when the relevant UI is centered and edges are expendable. Not acceptable if cropped content matters (e.g. sidebar UI cut off).
128
+
129
+
`.cast` clips rarely need this since their rendered aspect is derived from cols/rows; it's almost always a browser-capture concern.
130
+
111
131
### Duration checkpoint (mandatory, before proceeding)
112
132
113
133
Check whether the planned speed factor produces a final duration within the pacing table's target range:
@@ -182,6 +202,7 @@ Use a run-scoped props path like `$PROPS`; do not reuse a global `/tmp/showcase-
182
202
|`windowTitle`|`string`| no | Text in the window title bar |
183
203
|`width`|`number`| no | Output width (default: 2560 for inspect, else 1920) |
184
204
|`height`|`number`| no | Output height (default: 1440 for inspect, else 1080) |
205
+
|`objectFit`|`"contain" \| "cover" \| "fill"`| no | How each clip fits its panel. Default `"contain"` (letterbox to preserve aspect). Use `"cover"` when clip aspect doesn't match panel aspect and you'd rather crop than see black bars. See "Clip aspect ratio" below. |
0 commit comments