@officexapp/vidfarm-devcli 0.21.35 β 0.21.36
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/.agents/skills/editor-capabilities/SKILL.md +1 -1
- package/.agents/skills/vidfarm/SKILL.md +7 -3
- package/.agents/skills/vidfarm/harnesses/short-form.HARNESS.md +3 -3
- package/.agents/skills/vidfarm/recipes/cutout-graphics-for-explainers.md +42 -12
- package/.agents/skills/vidfarm/references/automation-and-local-dev.md +4 -4
- package/.agents/skills/vidfarm/references/hooks-and-virality.md +3 -2
- package/SKILL.director.md +56 -21
- package/SKILL.md +1 -1
- package/dist/src/cli.js +429 -53
- package/dist/src/devcli/handoff.js +54 -33
- package/dist/src/devcli/plate-key.js +698 -0
- package/dist/src/devcli/sticker-pack.js +48 -0
- package/package.json +3 -2
|
@@ -84,7 +84,7 @@ Every video you touch has four charges in series, and **you write them before yo
|
|
|
84
84
|
1. πͺ **Hook** β the opening line, as text, on screen at `start:0`. A **complete clause** (subject + verb), no jargon, naming a **situation** ("I've quit six businesses") not a label ("anonymity"). Caption chunk 1 is read before any audio β muted autoplay is the default viewing condition, so the text hook outworks the spoken one. Banned openings: throat-clearing, a logo, a title card, a fade from black, context before the claim.
|
|
85
85
|
2. π **Loop** β one open question by 0:10, stated **on screen**, closing **inside this video** (name the timestamp; if you can't, there's no loop). The withheld answer must be one the viewer **can't supply themselves** β a loop whose answer they can guess passes every mechanical check and dies in the field.
|
|
86
86
|
3. π **Payoff** β shown, not summarized, landing before the final beat. The payoff is not the CTA.
|
|
87
|
-
4. π£ **Bait** β one ask, final beat, and tell the user to put it in the post caption too.
|
|
87
|
+
4. π£ **Bait** β one ask, final beat, and tell the user to put it in the post caption too. A keyword comment ask ("comment CLIPPER and I'll send the breakdown") is standard and allowed. Never "follow for part two", ragebait, or an earnings/health claim traded for the reply.
|
|
88
88
|
|
|
89
89
|
**On a re-theme this is the thing you protect.** `editor_context` β `viral_dna.hook` / `retention` / `payoff` / `emotional_punch` tells you what the source's charges were β that structure is *why the template worked*. Rebuild each charge for the new subject; flattening the loop into a product statement is the most common way a re-theme kills a format.
|
|
90
90
|
|
|
@@ -209,13 +209,17 @@ Present both harnesses to the director, recommend (A) unless they've asked for p
|
|
|
209
209
|
|
|
210
210
|
**Explainer/cutout videos β the transparent-sticker workflow.** For explainers (a subject "on stage" while labels, arrows, and props pop in around it), the cheap workhorse is a **transparent cutout sticker**: `vidfarm cutout --generate "<subject>"` AI-generates the graphic on a chroma plate, keys it out, **and trims the canvas down to the subject's true min width/height** β one free local ffmpeg step, no mostly-empty PNG to fight with β then `vidfarm place` + `vidfarm keyframes` scale/position and animate it (zoom, grow, shake, drift). It's the same "generate a reusable element once, then reuse it" thrift as the cheap harness, tuned for stickers. Full guided harness: recipe `recipes/cutout-graphics-for-explainers.md`; placement + zoom/grow/shake/move motion recipes: `references/editor-workflows.md` (βCutout graphics for explainersβ).
|
|
211
211
|
|
|
212
|
-
**"Make me a sticker pack" = ONE greenscreen sheet of many items, then masked apart β and `vidfarm sticker-pack` is that whole loop.** A sticker pack is never one graphic; it's a *set* (props, icons, reactions, characters, backdrops) that must share one art style. Generating them one at a time is both expensive (N image jobs) and inconsistent (N independent styles), so the move is the opposite: **generate a single image holding every item, laid out on a flat greenscreen plate, then cut each item out locally for $0.** `vidfarm sticker-pack --generate "<theme>" --items "a,b,c"` does all of it β one billed image job for the whole set, then a free local key, an **automatic** alpha-segmentation that finds each item (no hand-measured `--crop` rects), a per-item trim to its true bounding box, and a `stickers.json` manifest. Already have a greenscreen sheet? `vidfarm sticker-pack ./sheet.png` cuts it up for **$0**. Use `--dry-run` to eyeball the detected boxes first; `--gap` merges/splits items that came out joined or broken; `vidfarm mask <sheet> --crop β¦` is the manual fallback for one stubborn item.
|
|
212
|
+
**"Make me a sticker pack" = ONE greenscreen sheet of many items, then masked apart β and `vidfarm sticker-pack` is that whole loop.** A sticker pack is never one graphic; it's a *set* (props, icons, reactions, characters, backdrops) that must share one art style. Generating them one at a time is both expensive (N image jobs) and inconsistent (N independent styles), so the move is the opposite: **generate a single image holding every item, laid out on a flat greenscreen plate, then cut each item out locally for $0.** `vidfarm sticker-pack --generate "<theme>" --items "a,b,c"` does all of it β one billed image job for the whole set, then a free local key, an **automatic** alpha-segmentation that finds each item (no hand-measured `--crop` rects), a per-item trim to its true bounding box, and a `stickers.json` manifest. The sheet comes in two shapes: **zoned** (a grid of color panels, one plate color per item β the default for 2+ named items, and what frees the art from a single banned hue) and **flat** (the classic one-color plate, for a model that can't follow a color-block grid). Already have a greenscreen sheet? `vidfarm sticker-pack ./sheet.png` cuts it up for **$0**. Use `--dry-run` to eyeball the detected boxes first; `--gap` merges/splits items that came out joined or broken; `vidfarm mask <sheet> --crop β¦` is the manual fallback for one stubborn item.
|
|
213
213
|
|
|
214
214
|
- **Stickers are not necessarily small.** A sticker is *any* transparent element you place and animate β an icon, a mascot, a prop, a character, and equally **a full-width landscape, skyline, or backdrop** that fills the frame. `sticker-pack` filters speckle only; it has no maximum item size. Ask for the big pieces in the same sheet as the small ones.
|
|
215
215
|
- **Stickers are usually animated, not pasted.** Once placed, animate each one with `vidfarm keyframes` presets (`pop-in`, `float`, `shake`, `grow`, `slide-in-left`, `drift`) β that's HTML/CSS canvas motion, deterministic, free, and identical in preview and render. Layer moves up (pop-in, then idle float) for real life. See `references/editor-workflows.md` β "Cutout graphics for explainers".
|
|
216
216
|
- **A sticker can carry its OWN motion too.** A *moving* subject has no single bounding box, so it isn't a PNG: key the clip with `vidfarm remove-greenscreen <video>` β transparent WebM (browser/editor-playable, the right choice on a composition).
|
|
217
|
-
- **The
|
|
218
|
-
- **
|
|
217
|
+
- **The key is CONNECTIVITY-based, so "the art can't use the plate color" is no longer true β only its OUTER EDGE can't.** `sticker-pack`/`cutout` (and `remove-greenscreen <image> --smart`) don't delete every pixel that looks like the plate. They flood-fill the plate **inward from the edge of the sheet** and delete only background that **reaches** that edge. A green leaf inside a mascot, a plate-colored eye, an outline shape whose interior was left as bare plate β none of it is reachable, so none of it is deleted. Edges are feathered and the plate is **un-mixed out of each edge pixel individually** (real alpha math, not a global `despill`), which is what kills the green fringe a flat key leaves. What still matters: the item's **silhouette** must be a different color from its own plate, and nothing may **fade** into the plate (no soft glow, blur or drop shadow on the background). Say the win out loud when it matters β the console prints *"kept N plate-colored pixels INSIDE the art that a flat key would have punched out."* `--key-mode flat` restores the old plain-chromakey behaviour (the cloud path's exact filter chain β use it to reproduce a cloud render, or as a simple fallback).
|
|
218
|
+
- **Plate color is still chosen for you, and it still matters for the silhouette.** When generating, `sticker-pack`/`cutout` read the subject and move the plate off any hue it mentions β green β magenta (`#FF00FF`) β blue (`#0047BB`) β black β white β printing which plate they picked and why. When splitting a sheet you already have, they **read the plate off the sheet itself**, so a red/purple/blue sheet from a web generator just works. Pin it with `--key-color "#FF00FF"` / `--preset magenta`, or `--no-auto-key` for plain green.
|
|
219
|
+
- **ONE PLATE COLOR PER STICKER β `--sheet-mode zoned`.** The real fix for "our art has to be simple because of the greenscreen" is to stop giving a whole sheet one background. A **zoned** sheet is a grid of solid color **panels**, one item per panel, each panel's plate chosen against **that item**: a green frog on magenta beside a pink flower on green, in one image job. Each panel is keyed independently with its own color (read back off that panel's own corners, because models drift the hue they were asked for), and item art may then use **any palette at all β including the color of a different panel**. Bonus: names stop being guessed from reading order β panel N holds the item you asked for in panel N, so `--items` maps exactly, and `stickers.json` records each sticker's `panel` and `plate`. `--sheet-mode auto` (the default) zones a generation of 2+ named items and stays flat otherwise. Reading a zoned sheet you already have: `--zones auto` (default β recovers the grid from the sheet's own edges) or `--zones 3x2`.
|
|
220
|
+
- **The FLAT single-color sheet is still first-class β use it for a weaker image model.** Not every model can hold a color-block grid; a cheap or small one will paint one background regardless of the prompt. That path is fully supported: `--sheet-mode flat` asks for the classic one-plate sheet, and even if you asked for zones, keying **detects a model that ignored the grid** (a panel with no plate to remove, or one whose item filled it corner to corner) and **automatically re-keys the sheet as one plate**, telling you it did. So zoning can't strand you β worst case you're back on the simple method, still for $0.
|
|
221
|
+
- **Painterly, soft, furry or glassy art β `--refine`.** Chroma keying of any kind needs a crisp silhouette. When the art has genuinely soft edges (watercolor, fur, glow, glass, a cast shadow), add `--refine`: after the keyer locates each item, that item is re-cut from the **un-keyed** sheet with the local ONNX matting model (free, ~1β2s each), which is color-blind and handles soft mattes. It sanity-checks each matte and falls back to the keyed cut per item if the model didn't find a subject β flat vector art is exactly the case where matting fails and the chroma cut is better, so don't reach for `--refine` by default.
|
|
222
|
+
- **What the ART still has to honor: a crisp silhouette, sealed shapes, and gaps between items.** The connectivity key removes the old bans on hollow art and plate-colored fills, but three prompt rules are still load-bearing: **(1)** every object's **outer edge** is a clearly different color from its own plate and is **crisp** β no glow, blur, mist or drop shadow fading into the background; **(2)** enclosed areas are **sealed by the artwork**, because a gap in an outline lets the background flow in and the fill really does get keyed; **(3)** items are separated by a clear margin of plate β two touching items segment as ONE sticker. `cutout --generate`, `sticker-pack --generate`, `handoff image` and the `create-overlay` primitive **append the right clause for you** (a relaxed one for the smart keyer, the strict "closed, solidly filled, nothing in a near-plate shade" one when `--key-mode flat` is in play) β write it yourself only when prompting a generator directly. Both commands still report per-item `hole_pct`/`hollow` (console `β N% hollow`, `--json`, `stickers.json`); under the smart keyer a flagged item is *usually real* (a ring, frame, donut, or pieces with background between them), so it **warns, never blocks**. One stubborn item can always be lifted with `vidfarm mask --crop β¦` (ONNX matting ignores color entirely).
|
|
219
223
|
- **Transparent GIF is supported, for GIF-only surfaces.** `vidfarm sticker-pack β¦ --output-format gif` (stills) and `vidfarm remove-greenscreen <video> --gif` (animated) emit transparent GIFs. GIF alpha is **1-bit**, so edges go hard β fine for chat/forum/Notion sticker surfaces, worse than PNG/WebP/WebM for compositing on a timeline. Prefer PNG/WebP/WebM unless the destination only eats GIF.
|
|
220
224
|
|
|
221
225
|
**Explainer house style β the defaults to build with unless told otherwise.** **White background / light mode** (plain white stage, no gradients, no dark mode, no photo backdrop), **kinetic word-by-word captions** in dark ink on the light stage (`vidfarm captions generate --style word-pop --color "#111111" --active-color "#7C3AED" --background-style plain` β skip outlines/shadows, they're only needed over busy footage), and **female TTS narration** (`vidfarm tts --voice coral` on OpenAI β `nova` for energy, `sage` for calm; `Kore`/`Leda` on Gemini; any ElevenLabs voice via `vidfarm voices`). **Keep it clean and simple** β one idea on screen at a time, two or three cutouts per beat, one accent color, one font, lots of white space; remove before you add. **Illustrations default to simplicity**: flat vector, simple shapes, minimal detail, 2β3 flat colors, no baked-in text β simple art keys cleanly, trims tight, and stays on-style across the whole cast. State the defaults once so the director can override any of them. Full detail: recipe `recipes/cutout-graphics-for-explainers.md` (βHouse style β the explainer defaultsβ). **If the director takes the stage off white**, two things stop being optional: every sticker's **white die-cut rim** has to be stripped (on a dark stage it's a glaring halo and the most obvious bot-made artefact in the frame β recipe β βStickers on a DARK or photographic stageβ), and the caption hexes above stop applying β **caption colour, active-word colour and plate are chosen by measuring the composited background behind the caption band**, one treatment per video (`harnesses/short-form.HARNESS.md` β βCaption styling is MEASURED off the backgroundβ). Related: **on-screen text and captions must not say the same thing at once** β display text carries the argument, captions carry only what the screen doesn't show.
|
|
@@ -87,9 +87,9 @@ The moment the video pays what the hook promised, landing on **what they actuall
|
|
|
87
87
|
|
|
88
88
|
A video with replies gets shown again; a video with none dies at its first audience regardless of watch time. **Bait is a deliberate beat, not something you hope for.** One ask, in the final beat, **and in the post caption** (many people reply from the caption without finishing).
|
|
89
89
|
|
|
90
|
-
Works: the confession invite ("tell me which one you already quit") Β· the guess ("guess how long it took, I say it at the end" β pairs perfectly with a withheld-number loop) Β· the named omission ("I left one thing out on purpose, ask me") Β· the soft disagree (a true concession people want to argue with) Β· a specific question, never "thoughts?".
|
|
90
|
+
Works: the confession invite ("tell me which one you already quit") Β· the guess ("guess how long it took, I say it at the end" β pairs perfectly with a withheld-number loop) Β· the named omission ("I left one thing out on purpose, ask me") Β· the soft disagree (a true concession people want to argue with) Β· a specific question, never "thoughts?" Β· the keyword comment ("comment CLIPPER and I'll send the breakdown") β standard and allowed; keep the keyword topical and actually hand over what you promised.
|
|
91
91
|
|
|
92
|
-
Doesn't: ragebait or a deliberate error to farm corrections (works once, costs the positioning permanently) Β· "follow for part two" (breaks Rule 1) Β·
|
|
92
|
+
Doesn't: ragebait or a deliberate error to farm corrections (works once, costs the positioning permanently) Β· "follow for part two" (breaks Rule 1) Β· an earnings/health claim attached to the ask ("comment MONEY and I'll show you how to make $10k/mo" β the keyword is fine, the claim isn't) Β· anything that makes bait the price of the payoff. **Pay off first, then ask.**
|
|
93
93
|
|
|
94
94
|
### π Captions β the delivery system for three of the four charges
|
|
95
95
|
|
|
@@ -180,7 +180,7 @@ Verbatim captions in the font regime and the safe zone Β· frame 0 works as hook
|
|
|
180
180
|
- [ ] π The loop closes in this video, and the payoff is the thing that was promised
|
|
181
181
|
- [ ] π The payoff is shown, not summarized, and lands before the final beat
|
|
182
182
|
- [ ] π£ One bait ask, in the final beat and in the post caption
|
|
183
|
-
- [ ] π£ The bait is not ragebait, a
|
|
183
|
+
- [ ] π£ The bait is not ragebait, a follow-for-part-two, or an earnings/health claim traded for the reply (a keyword comment ask is fine)
|
|
184
184
|
|
|
185
185
|
**Standalone**
|
|
186
186
|
- [ ] A stranger seeing only this video understands what it's about
|
|
@@ -56,28 +56,58 @@ Out comes `./stickers/sticker-01-red-barn.png`, `sticker-02-tractor.png`, β¦ ea
|
|
|
56
56
|
- `--gap <pct>` (default 1.2) β how far apart two islands must be to count as separate items. **Two items came out as one sticker β lower it** (or ask for wider spacing on the sheet). **One item came out split in two β raise it** (its parts, e.g. a floating antenna or a dotted arrow, weren't bridged).
|
|
57
57
|
- `--min-area <pct>` (default 0.15) β drops key speckle. There is **no maximum** β see the size note below.
|
|
58
58
|
- `--preset`/`--key-color` β match the plate (default `#00FF00`). `--pad`, `--alpha-threshold`, `--output-format png|webp|gif`, `--prefix`, `--max-items`, `--keep-plate`/`--keep-sheet` behave like `cutout`'s.
|
|
59
|
+
- `--sheet-mode auto|zoned|flat`, `--zones auto|off|RxC`, `--zone-cols <n>`, `--key-mode smart|flat`, `--refine` β how the plate(s) are laid out and removed. All four are explained below ("How the key actually works now").
|
|
59
60
|
- Stubborn item? Fall back to one hand-measured `vidfarm mask ./sheet.png --crop x,y,w,h --flat "#00FF00"` for that one; the rest of the pack still comes from `sticker-pack`.
|
|
60
61
|
|
|
61
|
-
**
|
|
62
|
+
**How the key actually works now β CONNECTIVITY, not color matching.** This is the thing to internalize, because it removes the constraint that used to force sticker art to stay flat and simple. `sticker-pack` and `cutout` do **not** delete every pixel that looks like the plate. They score each pixel's distance to its plate color, then **flood-fill inward from the edge of the sheet** through plate-ish pixels, and delete only what the fill **reaches**. Consequences, all of them useful:
|
|
62
63
|
|
|
63
|
-
- **
|
|
64
|
-
- **
|
|
64
|
+
- **Plate-colored art survives if it's inside the item.** A green leaf on a green sheet, a `#00FF00` eye, a highlight in the plate hue β unreachable from the sheet edge, therefore not background, therefore kept. The console tells you when it mattered: *"kept 10,000 plate-colored pixels INSIDE the art that a flat key would have punched out."*
|
|
65
|
+
- **Outline / line-art shapes keep their middles.** The old "rim around a see-through hole" failure is a property of the flat chromakey, not of keying. An enclosed interior can't be reached by the fill.
|
|
66
|
+
- **Edges come out clean.** Boundary pixels get a real coverage estimate and the plate is **un-mixed out of each one individually** (`art = (C β (1βΞ±)Β·plate)/Ξ±`, stored as straight alpha), so there's no green fringe. That's strictly better than ffmpeg's global `despill`, which rebalances every pixel and discolors plate-hued art in the interior.
|
|
67
|
+
- **`--key-mode flat` brings the old behaviour back.** It's the cloud primitive's exact filter chain β use it to reproduce a cloud render bit-for-bit, or as a simple fallback.
|
|
65
68
|
|
|
66
|
-
|
|
69
|
+
What the key still can't do for you: an item whose **outer edge** is the plate color dissolves into it, and anything that **fades** into the plate (soft glow, blur, drop shadow) has no crisp silhouette to find.
|
|
67
70
|
|
|
68
|
-
**
|
|
71
|
+
**ONE PLATE COLOR PER STICKER β `--sheet-mode zoned`.** The silhouette constraint is what "one plate per sheet" makes painful: the more items on the sheet, the more of the palette is off-limits to all of them. So stop giving the sheet one background. A **zoned** sheet is a grid of solid color **panels**, one item per panel, each panel's plate chosen against **that item**:
|
|
69
72
|
|
|
70
|
-
|
|
73
|
+
```
|
|
74
|
+
# 6 items β a 3Γ2 grid of color panels, each item's plate picked against its own art
|
|
75
|
+
vidfarm sticker-pack --generate "pond life, flat vector" \
|
|
76
|
+
--items "green frog,pink lotus,blue heron,white pebble,yellow reed,orange koi" \
|
|
77
|
+
--sheet-mode zoned --out-dir ./stickers
|
|
78
|
+
|
|
79
|
+
# A zoned sheet from a web tool: recover the panels from the sheet's own edges
|
|
80
|
+
vidfarm sticker-pack ./sheet.png --zones auto # (this is the default)
|
|
81
|
+
vidfarm sticker-pack ./sheet.png --zones 3x2 # or declare the grid you asked for
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- The green frog sits on magenta while the pink lotus sits on green β **in the same image job**. Item art may use **any** palette, including the colors of the *other* panels.
|
|
85
|
+
- Each panel is keyed independently, with its color read back off **that panel's own corners** (image models drift the exact hue they were told, so the sheet is the source of truth, not the prompt).
|
|
86
|
+
- **Names stop being guessed.** On a flat sheet, `--items` is matched to items in reading order, which goes off-by-one the moment two items merge. On a zoned sheet, panel *N* holds the item you asked for in panel *N* β so the mapping is exact, and `stickers.json` records each sticker's `panel` and `plate`.
|
|
87
|
+
- `--sheet-mode auto` (the default) zones a generation of 2+ named items and stays flat otherwise. `--zone-cols <n>` forces the grid width.
|
|
88
|
+
|
|
89
|
+
**The FLAT one-color sheet is still first-class β reach for it with a weaker image model.** A cheap or small model will paint one background no matter how the grid is described. That's fine and fully supported:
|
|
90
|
+
|
|
91
|
+
- `--sheet-mode flat` asks for the classic single-plate sheet (and `--key-mode smart` still applies, so hollow art and plate-colored interiors are still safe).
|
|
92
|
+
- If you asked for zones and the model ignored them, **keying detects it and re-keys the sheet as one plate automatically** β either because a "panel" had no plate to remove, or because its item filled the panel corner to corner (so the item's own color read as the plate). It says so on the console and in `stickers.json` (`key_note`). Zoning can't strand you.
|
|
93
|
+
|
|
94
|
+
**Plate color is still chosen for you on a flat sheet.** `--generate` reads the subject and moves the plate off any hue it mentions β green (`#00FF00`) β magenta (`#FF00FF`) β blue (`#0047BB`) β black β white β and prints which it chose and why; say it back to the director when it moves (*"your items are mostly green, so I generated them on a magenta plate"*). Splitting a sheet you already have, the plate is read off the sheet itself, so a red/purple/blue sheet from a free web generator just works. Pin it with `--key-color "#FF00FF"` / `--preset magenta`, or `--no-auto-key` for plain green.
|
|
95
|
+
|
|
96
|
+
**Soft, painterly, furry or glassy art β `--refine`.** Every chroma key needs a crisp silhouette, so watercolor edges, fur, glow, glass and cast shadows are out of scope for the keyer no matter how clever the fill is. `--refine` handles them: the keyer's job shrinks to *locating* each item, and the item is then re-cut from the **un-keyed** sheet with the local ONNX matting model (free, ~1β2s each), which ignores color entirely and produces a genuine soft matte.
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
vidfarm sticker-pack ./painterly-sheet.png --refine --out-dir ./stickers
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
It's checked, not trusted: the matte is measured, and if it came back **empty** or **fully opaque** (the model didn't see a subject) that item keeps its keyed cut and the console says so. Flat vector art is exactly where matting fails and the chroma cut is better β so **don't use `--refine` by default**, only when the art is genuinely soft.
|
|
71
103
|
|
|
72
|
-
|
|
104
|
+
**What the prompt still has to ask for.** Three rules survive, and they're all about geometry rather than color:
|
|
73
105
|
|
|
74
|
-
|
|
106
|
+
> Every object's OUTER EDGE must be a clearly different color from its own panel's background, and crisp β no glow, blur, mist, drop shadow or reflection fading from the object into the background. Every enclosed area must be sealed by the artwork itself, not open to the background. Keep a clear margin of plain background between objects and around the sheet edge; nothing touching, overlapping or connected.
|
|
75
107
|
|
|
76
|
-
|
|
108
|
+
`cutout --generate`, `sticker-pack --generate`, `vidfarm handoff image` and the `create-overlay` REST primitive append the right clause for you β the relaxed one above for the smart keyer, and the strict "closed, solidly filled shapes, nothing in a near-plate shade, fully opaque" clause when `--key-mode flat` is in play. **Write it yourself only when you prompt a generator directly** (a free web tool by hand, or your own `POST /api/v1/primitives/images/generate` call).
|
|
77
109
|
|
|
78
|
-
- **
|
|
79
|
-
- If the fill was merely *close* to the plate rather than absent, a lower `--tolerance` can rescue the sheet you already have. Nothing rescues a genuinely empty interior.
|
|
80
|
-
- Last resort for one stubborn item: `vidfarm mask ./sheet.png --crop x,y,w,h` β ONNX matting doesn't care what color the fill is, so it lifts art the chroma key can't.
|
|
110
|
+
**The hollow check still runs, and it means something different now.** `sticker-pack` and `cutout` measure the transparent area **fully enclosed by an item's own art** and report `hole_pct` (plus `holes`, `hollow: true` at β₯20%) in `--json`, in `stickers.json`, and as a `β N% hollow` console flag. Under the smart keyer an enclosed hole **can't** have been keyed away, so a flag is usually *real* art β a ring, donut, picture frame, letter "O", or an item drawn as separate pieces with background showing between them. It warns, never blocks. If a flagged item genuinely looks wrong, the shape's fill is **open** to the background through a gap in its outline; ask the prompt for sealed shapes. Last resort for one stubborn item: `vidfarm mask ./sheet.png --crop x,y,w,h` β ONNX matting doesn't care what color anything is.
|
|
81
111
|
|
|
82
112
|
**Generation is the failure point, not the cutting.** The sheet prompt is auto-appended with the important instruction β *every item fully separated by clear plate-colored background, nothing touching or overlapping, wide margins, no text, no shadows, one consistent style* β because **touching items segment as one sticker**. If a pack comes back merged, re-run the generation asking for more spacing before you fight the `--gap` knob.
|
|
83
113
|
|
|
@@ -248,11 +248,11 @@ The licensed harness also carries the **generative build workflow** guidance (ch
|
|
|
248
248
|
| `vidfarm generate <image\|video> --prompt "β¦"` | `POST /api/v1/primitives/{images,videos}/generate` (polls job) | generate AI media β finished URL |
|
|
249
249
|
| `vidfarm inpaint <image> --mask <png> --prompt "β¦" [--region "label=β¦"] [--ref β¦] [--out <f>]` | `POST /api/v1/primitives/images/inpaint` (polls job) | masked image EDIT β replace ONLY the transparent-mask region, keep everything else (devcli twin of the /inpaint page) |
|
|
250
250
|
| `vidfarm create-overlay "<subject>" [--key-color #00FF00] [--aspect-ratio 1:1] [--place <dir>] [--out <f>]` | `POST /api/v1/primitives/images/create-overlay` (polls job) | **Vox-style** transparent OVERLAY β AI image on a forced key-color background, chroma-keyed out in one job β ready-to-composite transparent PNG |
|
|
251
|
-
| `vidfarm remove-greenscreen <image\|video> [--preset green\|blue\|white\|black\|digital-green\|magenta] [--key-color #00FF00] [--tolerance 0.3] [--local] [--gif] [--out <f>]` | `POST /api/v1/primitives/remove-greenscreen` (polls job) | chroma-key a FLAT solid background β transparent PNG/WebP (image) or WebM/VP9-alpha (video); auto-detects media kind. `--local` runs it FREE in-process (sharp/ffmpeg, no wallet); default cloud is billed at real compute Γ 1.2. **`--gif` writes a transparent GIF instead** (ANIMATED for a clip; `--gif-fps`/`--gif-width`/`--gif-alpha`) β local-only, 1-bit alpha, for GIF-only sticker surfaces; prefer PNG/WebP/WebM for compositing. Aliases: `greenscreen`, `remove-background-greenscreen`. |
|
|
251
|
+
| `vidfarm remove-greenscreen <image\|video> [--preset green\|blue\|white\|black\|digital-green\|magenta] [--key-color #00FF00] [--tolerance 0.3] [--local] [--gif] [--out <f>]` | `POST /api/v1/primitives/remove-greenscreen` (polls job) | chroma-key a FLAT solid background β transparent PNG/WebP (image) or WebM/VP9-alpha (video); auto-detects media kind. `--local` runs it FREE in-process (sharp/ffmpeg, no wallet); default cloud is billed at real compute Γ 1.2. **`--gif` writes a transparent GIF instead** (ANIMATED for a clip; `--gif-fps`/`--gif-width`/`--gif-alpha`) β local-only, 1-bit alpha, for GIF-only sticker surfaces; prefer PNG/WebP/WebM for compositing. **`--smart`** (IMAGE + local only) swaps the flat chromakey for the connectivity keyer `cutout`/`sticker-pack` use, so plate-colored detail inside the subject and hollow/outline art survive. Aliases: `greenscreen`, `remove-background-greenscreen`. |
|
|
252
252
|
| `vidfarm dedupe <video\|image\|url> [--preset light\|standard\|strong] [--variants N] [--seed <s>] [--zoom/--rotate/--skew/--speed/--saturation/--hue/--noise/--flip] [--local\|--cloud] [--out <f>\|--out-dir <d>]` | **local, free, ffmpeg-only** by default (no job); `--cloud` = `POST /api/v1/primitives/media/dedupe` (polls job) | **DEDUPLICATION β the publish-safety pass.** Makes a finished render read as a NEW upload to a platform's duplicate-content detector, invisibly to a viewer. Default preset `standard` = skew 2%, zoom 3%, rotate 2Β°, speed +2%, saturation +4%, plus contrast/brightness/hue/grain, a container-metadata strip and a per-variant CRF walk. **Runs on the EXPORTED file β never re-render for this.** `--variants N` mints N copies that differ from the original AND from each other (jittered magnitudes, alternating signs), one per account/posting slot; `--seed` makes a batch reproducible. A rotate forces a bigger centre-crop to hide the black corners (~6.7% on a tall frame at 2Β°) and says so β pass `--rotate 0` when framing matters more. `--flip` is the strongest single knob but visibly reverses on-screen text. **Ask the operator whether they want this BEFORE publishing or bulk-producing.** Aliases: `dedup`, `deduplicate`, `uniquify`. |
|
|
253
|
-
| `vidfarm cutout <image\|url> [--generate "<prompt>"] [--preset green] [--pad <px>] [--alpha-threshold <n>] [--no-trim] [--output-format png\|webp] [--out <f>]` | **local, free, ffmpeg-only** (no job) β key + `alphaextract`/`cropdetect` trim | **The transparent explainer-STICKER maker.** Keys out the flat plate **and then shrinks the canvas to the cutout's true min width/height** (a 1024Β² mostly-empty plate β a snug sticker whose pixel size IS the subject) so you can scale/position it precisely. `--generate` AI-generates the graphic first on a matching chroma plate (that step is the billed image primitive), then keys+trims in one shot; without it, keys+trims a file/url you already have. **IMAGE-only** (a moving subject has no single bounding box β key a clip with `remove-greenscreen`). Prefer this over `create-overlay` locally: same idea, but free and auto-trimmed. `--pad` keeps transparent breathing room; `--json` reports final `width`/`height`/`area_reduced_pct`,
|
|
253
|
+
| `vidfarm cutout <image\|url> [--generate "<prompt>"] [--preset green] [--pad <px>] [--alpha-threshold <n>] [--no-trim] [--output-format png\|webp] [--out <f>]` | **local, free, ffmpeg-only** (no job) β key + `alphaextract`/`cropdetect` trim | **The transparent explainer-STICKER maker.** Keys out the flat plate **and then shrinks the canvas to the cutout's true min width/height** (a 1024Β² mostly-empty plate β a snug sticker whose pixel size IS the subject) so you can scale/position it precisely. `--generate` AI-generates the graphic first on a matching chroma plate (that step is the billed image primitive), then keys+trims in one shot; without it, keys+trims a file/url you already have. **IMAGE-only** (a moving subject has no single bounding box β key a clip with `remove-greenscreen`). Prefer this over `create-overlay` locally: same idea, but free and auto-trimmed. Keys by CONNECTIVITY by default (`--key-mode smart`): the plate is flood-filled in from the frame edge, so plate-colored detail inside the subject and hollow/outline art survive, and the plate is un-mixed out of each edge pixel individually instead of by a global `despill`. `--key-mode flat` is the old plain chromakey. `--pad` keeps transparent breathing room; `--json` reports final `width`/`height`/`area_reduced_pct`, `key_mode`, `protected_px` (plate-colored pixels kept inside the art), plus `hole_pct`/`hollow` (under the smart keyer an enclosed hole is usually real art, so it warns only). Alias: `sticker`. See recipe `cutout-graphics-for-explainers.md`. |
|
|
254
254
|
| `vidfarm mask <image\|url> [--crop x,y,w,h] [--flat <hex>] [--pad <px>] [--alpha-threshold <n>] [--no-trim] [--output-format png\|webp] [--keep-region <f>] [--out <f>]` | **local, free** (no job) β ffmpeg crop + ONNX matting (or ffmpeg chroma-key) + `cropdetect` trim | **Lift an illustration OUT of an image you already have** (infographic / poster / marketing graphic / brand sheet / screenshot) β snug transparent PNG, the same reusable explainer sticker `cutout` makes but with **$0 and zero AI generation** β the cost-saving move whenever source art exists. `--crop x,y,w,h` (pixels **or** %) isolates ONE element from a multi-illustration source before masking (re-run with different rects to grab each). Background removed by **local ONNX matting** (any/busy background) by default, or **`--flat <hexcolor>`** chroma-keys a solid fill for crisper edges (an infographic's cream/white paper); then trims to the subject's true min width/height. **IMAGE-only** (matte a clip with `remove-background`). Aliases: `isolate`, `extract`. See recipe `cutout-graphics-for-explainers.md` β "Mask from an image you already have". |
|
|
255
|
-
| `vidfarm sticker-pack [sheet\|url] [--generate "<theme>"] [--items "a,b,c"] [--count <n>] [--dry-run] [--gap <pct>] [--min-area <pct>] [--output-format png\|webp\|gif] [--out-dir <d>]` | **local, free, ffmpeg-only** (no job; only `--generate` bills, ONCE for the whole set) β key + alpha-channel segmentation + per-item trim | **The STICKER-PACK maker β the answer whenever a director asks for "a sticker pack" / prop set / icon set.** A pack is ONE greenscreen sheet holding every item, keyed once and then masked apart: 1/N the cost of N `cutout` calls, and the only way a cast stays on-style. Finds each item **automatically** by segmenting the keyed sheet's alpha into connected islands β no hand-measured `--crop` rects β and writes one snug transparent file per item (named from `--items`, reading order) plus a `stickers.json` manifest. `--dry-run` prints the detected boxes first; `--gap` merges (lower) or splits (raise) items that came out joined/broken; items have **no maximum size** β a full-frame landscape/backdrop is as valid a sticker as a 3% icon. **
|
|
255
|
+
| `vidfarm sticker-pack [sheet\|url] [--generate "<theme>"] [--items "a,b,c"] [--count <n>] [--dry-run] [--gap <pct>] [--min-area <pct>] [--output-format png\|webp\|gif] [--out-dir <d>]` | **local, free, ffmpeg-only** (no job; only `--generate` bills, ONCE for the whole set) β key + alpha-channel segmentation + per-item trim | **The STICKER-PACK maker β the answer whenever a director asks for "a sticker pack" / prop set / icon set.** A pack is ONE greenscreen sheet holding every item, keyed once and then masked apart: 1/N the cost of N `cutout` calls, and the only way a cast stays on-style. Finds each item **automatically** by segmenting the keyed sheet's alpha into connected islands β no hand-measured `--crop` rects β and writes one snug transparent file per item (named from `--items`, reading order) plus a `stickers.json` manifest. `--dry-run` prints the detected boxes first; `--gap` merges (lower) or splits (raise) items that came out joined/broken; items have **no maximum size** β a full-frame landscape/backdrop is as valid a sticker as a 3% icon. **The key is CONNECTIVITY-based (`--key-mode smart`, the default):** the plate is flood-filled inward from the sheet's edge and only background that REACHES the edge is deleted, so plate-colored detail inside an item, and an outline shape whose interior is bare plate, both survive; edge pixels get the plate un-mixed out of them individually (real alpha math, better than a global `despill`). `--key-mode flat` is the old plain chromakey β the simple fallback and the way to match a cloud render exactly. **ONE PLATE PER STICKER (`--sheet-mode zoned`):** generates a grid of solid color PANELS, one item per panel, each panel's plate picked against that item (green frog on magenta beside a pink flower on green), keyed panel-by-panel with the color read back off that panel's own corners β item art may then use any palette including other panels' colors, and names map to PANELS instead of reading order (`panel`/`plate` land in `stickers.json`). `--sheet-mode auto` (default) zones a generation of 2+ named items; `--sheet-mode flat` forces the classic one-color sheet for a weaker model, and if a model ignores the grid anyway the keyer detects it (a panel with no plate, or one whose item filled it corner to corner) and **re-keys the sheet as one plate automatically**. Read a zoned sheet you already have with `--zones auto` (default) or `--zones 3x2`. **`--refine`** re-cuts each located item from the UN-keyed sheet with the local ONNX matting model (free, ~1β2s each) for painterly/soft/furry/glassy art, falling back per item to the keyed cut when the matte comes back empty or fully opaque. **Plate color is still chosen for you** when generating flat (green β magenta β blue β black β white) and detected off an existing sheet. Per-item `holes`/`hole_pct`/`hollow` are still reported (console `β N% hollow` at β₯20%, `--json`, `stickers.json`) β under the smart keyer a flag usually means real art (ring/frame/donut), so it **warns, never blocks**; lift a stubborn item with `vidfarm mask --crop β¦`. `--output-format gif` emits 1-bit-alpha GIFs for GIF-only surfaces. IMAGE-only. Aliases: `stickers`, `sticker-sheet`. See recipe `cutout-graphics-for-explainers.md` β "A sticker pack". |
|
|
256
256
|
| `vidfarm tts "β¦" [--style "β¦"] [--voice <v>] [--out <file>]` | (LOCAL-FIRST: your own OPENAI/GEMINI/OPENROUTER_API_KEY β audio file on disk; `--cloud` = `POST /api/v1/primitives/audio/speech` + poll, ElevenLabs on the platform key by default, `--own-key` for yours) | text β narration audio; `--cloud --voice <voice_id>` picks an ElevenLabs voice |
|
|
257
257
|
| `vidfarm music "<prompt>" [--length <sec>] [--out <f>] [--own-key]` | `POST /api/v1/primitives/music/generate` (polls job) | prompt β music track (ElevenLabs; platform key + wallet by default, `--own-key` for yours) |
|
|
258
258
|
| `vidfarm voices [--sample] [--search "β¦"] [--free\|--all] [--own-key] [--limit N]` | `GET /api/v1/primitives/audio/voices` | **Browse AND sample narration voices.** Default roster = the premium ElevenLabs catalog reached through **vidfarm's own ElevenLabs connection** β the user needs no ElevenLabs account, API key, or subscription; narration is billed as vidfarm wallet credits (pennies each). `--free` = the $0 local Kokoro roster (`--all` = both). `--sample` writes listenable clips to `./voice-samples` (`--sample-count`, `--sample-out`, `--sample-text`) and is **free on both tiers** β premium samples are ElevenLabs' own preview clips, free samples render locally β so it's safe in `minimize`. `--search` filters by name/labels/description. **In interactive mode play the samples and let the USER pick**; autonomous = default a voice and still say they can choose. `--own-key` lists the customer's own ElevenLabs account instead. |
|
|
@@ -281,7 +281,7 @@ The licensed harness also carries the **generative build workflow** guidance (ch
|
|
|
281
281
|
| `vidfarm whoami` | `GET /api/v1/user/me` | who am I (also prints the active cost mode) |
|
|
282
282
|
| `vidfarm cost-mode [minimize\|hybrid\|rich-ai\|pure-videogen]` | (local `~/.vidfarm/cost-mode.json`) | show/set the money-saving preference every billed command respects; no arg = show + explain each; `--clear` forgets it |
|
|
283
283
|
| `vidfarm mode [interactive\|autonomous]` | local (`~/.vidfarm/interaction-mode.json`) | **The SECOND preference axis β ask it alongside cost mode.** Is the human in the loop? `interactive` = at checkpoints you hand them a copy-paste brief (an image prompt for a FREE web generator; a keyword list for sourcing clips) and they hand files back β usually BETTER output, and in `minimize` the only way to get custom art at all. `autonomous` = you finish solo within the budget. Independent of cost mode: every cost mode runs either way. No arg prints the pair + the explainer to relay; `--clear` forgets; per-run `--interactive`/`--autonomous`. Aliases: `interaction-mode`, `interaction`. |
|
|
284
|
-
| `vidfarm handoff image --theme "<what>" [--items "a,b,c"] [--style β¦] [--single]` | local (pure text) | **The interactive-mode IMAGE brief.** Prints the exact prompt, the numbered steps, the free tools (meta.ai / ChatGPT / Gemini / HF Spaces) and the follow-up command. Defaults to a **sticker pack**: ONE sheet holding every item on a chroma plate β `vidfarm sticker-pack` splits it for $0. Picks a plate the art won't collide with (green art β magenta plate), spells out the
|
|
284
|
+
| `vidfarm handoff image --theme "<what>" [--items "a,b,c"] [--style β¦] [--single]` | local (pure text) | **The interactive-mode IMAGE brief.** Prints the exact prompt, the numbered steps, the free tools (meta.ai / ChatGPT / Gemini / HF Spaces) and the follow-up command. Defaults to a **sticker pack**: ONE sheet holding every item on a chroma plate β `vidfarm sticker-pack` splits it for $0. Picks a plate the art won't collide with (green art β magenta plate), spells out what the local keyer actually needs (a crisp silhouette in a different color from the plate, sealed shapes, clear gaps between items β hollow art and plate-colored detail INSIDE a shape are fine now), and carries that `--key-color` into the follow-up. `--single` for one subject. `--zoned` asks instead for a color-block sheet (one panel colour per item) and hands back a `--zones RxC` follow-up β worth it when the pack's own colors fight one plate, but leave it off for a free consumer tool that may not follow a grid. |
|
|
285
285
|
| `vidfarm handoff raws --keywords "a,b" [--platforms tiktok,youtube] [--count N] [--purpose "β¦"]` | local (pure text) | **The interactive-mode CLIP-SOURCING brief** β the bottom rung of the sourcing ladder (browser control β `clipper`/`raws scan --cloud` β public raws β the human). Prints what to search, how to download (a Google *search* for a downloader, never a link that rots), and the import command for when the folder is ready. |
|
|
286
286
|
| `vidfarm storyboard [dir] [--init] [--frames "Title\|scene,β¦"] [--json]` | local (`STORYBOARD.md` / `SCRIPT.md`) | **The plan pass, and a core part of the composition format.** Scaffolds/reads the project's `STORYBOARD.md`: ordered frames with `duration`/`status`/`src`/`scene`/`voiceover`. The Vidfarm editor renders this file in its **Storyboard** view (contact sheet + per-frame comments + `outline β built β animated` progress), so it's the cheapest place to get a director's approval before building. Not to be confused with `vidfarm sequence` (which GENERATES storyboard images for the pure-videogen pipeline). Alias: `plan`. |
|
|
287
287
|
| `vidfarm wallet [--job <id>\|--tracer <t>] [--limit <n>]` | `GET /api/v1/user/me/wallet` | cost log: balance + lifetime spend + recent charges. `--job <renderJobId>` prints **what that one video cost** (sums its charges); `--tracer <t>` sums a tracer. Cloud-only; readable on the free plan too (shows $0.00). Aliases: `spend`, `costs` |
|
|
@@ -228,10 +228,11 @@ A video with replies gets shown again; a video with none dies at its first audie
|
|
|
228
228
|
- **The named omission** β *"I left one thing out on purpose. Ask me."* Converts what you couldn't fit into the reason to reply.
|
|
229
229
|
- **The soft disagree** β a true concession people want to argue with. Not ragebait if you actually believe it.
|
|
230
230
|
- **The specific question** β concrete always beats "thoughts?".
|
|
231
|
+
- **The keyword comment** β *"Comment CLIPPER and I'll send you the breakdown."* Standard, allowed, and it works: the keyword is the reply the algorithm counts, and the word itself doubles as a filter. Keep the keyword topical (name the thing, not the money), promise something you actually hand over, and say what they get. What makes this beat go wrong is the *promise*, not the mechanic.
|
|
231
232
|
|
|
232
|
-
**β οΈ Bait is the highest-compliance-risk beat in the video.** For money/health/appearance topics the
|
|
233
|
+
**β οΈ Bait is the highest-compliance-risk beat in the video.** For money/health/appearance topics the risk is what you promise in exchange for the reply:
|
|
233
234
|
|
|
234
|
-
- β *"Comment MONEY and I'll
|
|
235
|
+
- β *"Comment MONEY and I'll show you how to make $10k/mo"* β the keyword is fine; the earnings claim attached to it is what's scam-coded and enforceable. Same line with a topical keyword and a deliverable ("Comment CLIPPER for the template") is fine.
|
|
235
236
|
- β *"How much do you want to make a month?"* β invites an earnings-claim thread you now own.
|
|
236
237
|
- β *"Follow for part two"* β breaks the standalone rule.
|
|
237
238
|
- β Fake controversy, ragebait, or a deliberate error to farm corrections. Works once, costs the positioning permanently.
|
package/SKILL.director.md
CHANGED
|
@@ -209,13 +209,17 @@ Present both harnesses to the director, recommend (A) unless they've asked for p
|
|
|
209
209
|
|
|
210
210
|
**Explainer/cutout videos β the transparent-sticker workflow.** For explainers (a subject "on stage" while labels, arrows, and props pop in around it), the cheap workhorse is a **transparent cutout sticker**: `vidfarm cutout --generate "<subject>"` AI-generates the graphic on a chroma plate, keys it out, **and trims the canvas down to the subject's true min width/height** β one free local ffmpeg step, no mostly-empty PNG to fight with β then `vidfarm place` + `vidfarm keyframes` scale/position and animate it (zoom, grow, shake, drift). It's the same "generate a reusable element once, then reuse it" thrift as the cheap harness, tuned for stickers. Full guided harness: recipe `recipes/cutout-graphics-for-explainers.md`; placement + zoom/grow/shake/move motion recipes: `references/editor-workflows.md` (βCutout graphics for explainersβ).
|
|
211
211
|
|
|
212
|
-
**"Make me a sticker pack" = ONE greenscreen sheet of many items, then masked apart β and `vidfarm sticker-pack` is that whole loop.** A sticker pack is never one graphic; it's a *set* (props, icons, reactions, characters, backdrops) that must share one art style. Generating them one at a time is both expensive (N image jobs) and inconsistent (N independent styles), so the move is the opposite: **generate a single image holding every item, laid out on a flat greenscreen plate, then cut each item out locally for $0.** `vidfarm sticker-pack --generate "<theme>" --items "a,b,c"` does all of it β one billed image job for the whole set, then a free local key, an **automatic** alpha-segmentation that finds each item (no hand-measured `--crop` rects), a per-item trim to its true bounding box, and a `stickers.json` manifest. Already have a greenscreen sheet? `vidfarm sticker-pack ./sheet.png` cuts it up for **$0**. Use `--dry-run` to eyeball the detected boxes first; `--gap` merges/splits items that came out joined or broken; `vidfarm mask <sheet> --crop β¦` is the manual fallback for one stubborn item.
|
|
212
|
+
**"Make me a sticker pack" = ONE greenscreen sheet of many items, then masked apart β and `vidfarm sticker-pack` is that whole loop.** A sticker pack is never one graphic; it's a *set* (props, icons, reactions, characters, backdrops) that must share one art style. Generating them one at a time is both expensive (N image jobs) and inconsistent (N independent styles), so the move is the opposite: **generate a single image holding every item, laid out on a flat greenscreen plate, then cut each item out locally for $0.** `vidfarm sticker-pack --generate "<theme>" --items "a,b,c"` does all of it β one billed image job for the whole set, then a free local key, an **automatic** alpha-segmentation that finds each item (no hand-measured `--crop` rects), a per-item trim to its true bounding box, and a `stickers.json` manifest. The sheet comes in two shapes: **zoned** (a grid of color panels, one plate color per item β the default for 2+ named items, and what frees the art from a single banned hue) and **flat** (the classic one-color plate, for a model that can't follow a color-block grid). Already have a greenscreen sheet? `vidfarm sticker-pack ./sheet.png` cuts it up for **$0**. Use `--dry-run` to eyeball the detected boxes first; `--gap` merges/splits items that came out joined or broken; `vidfarm mask <sheet> --crop β¦` is the manual fallback for one stubborn item.
|
|
213
213
|
|
|
214
214
|
- **Stickers are not necessarily small.** A sticker is *any* transparent element you place and animate β an icon, a mascot, a prop, a character, and equally **a full-width landscape, skyline, or backdrop** that fills the frame. `sticker-pack` filters speckle only; it has no maximum item size. Ask for the big pieces in the same sheet as the small ones.
|
|
215
215
|
- **Stickers are usually animated, not pasted.** Once placed, animate each one with `vidfarm keyframes` presets (`pop-in`, `float`, `shake`, `grow`, `slide-in-left`, `drift`) β that's HTML/CSS canvas motion, deterministic, free, and identical in preview and render. Layer moves up (pop-in, then idle float) for real life. See `references/editor-workflows.md` β "Cutout graphics for explainers".
|
|
216
216
|
- **A sticker can carry its OWN motion too.** A *moving* subject has no single bounding box, so it isn't a PNG: key the clip with `vidfarm remove-greenscreen <video>` β transparent WebM (browser/editor-playable, the right choice on a composition).
|
|
217
|
-
- **The
|
|
218
|
-
- **
|
|
217
|
+
- **The key is CONNECTIVITY-based, so "the art can't use the plate color" is no longer true β only its OUTER EDGE can't.** `sticker-pack`/`cutout` (and `remove-greenscreen <image> --smart`) don't delete every pixel that looks like the plate. They flood-fill the plate **inward from the edge of the sheet** and delete only background that **reaches** that edge. A green leaf inside a mascot, a plate-colored eye, an outline shape whose interior was left as bare plate β none of it is reachable, so none of it is deleted. Edges are feathered and the plate is **un-mixed out of each edge pixel individually** (real alpha math, not a global `despill`), which is what kills the green fringe a flat key leaves. What still matters: the item's **silhouette** must be a different color from its own plate, and nothing may **fade** into the plate (no soft glow, blur or drop shadow on the background). Say the win out loud when it matters β the console prints *"kept N plate-colored pixels INSIDE the art that a flat key would have punched out."* `--key-mode flat` restores the old plain-chromakey behaviour (the cloud path's exact filter chain β use it to reproduce a cloud render, or as a simple fallback).
|
|
218
|
+
- **Plate color is still chosen for you, and it still matters for the silhouette.** When generating, `sticker-pack`/`cutout` read the subject and move the plate off any hue it mentions β green β magenta (`#FF00FF`) β blue (`#0047BB`) β black β white β printing which plate they picked and why. When splitting a sheet you already have, they **read the plate off the sheet itself**, so a red/purple/blue sheet from a web generator just works. Pin it with `--key-color "#FF00FF"` / `--preset magenta`, or `--no-auto-key` for plain green.
|
|
219
|
+
- **ONE PLATE COLOR PER STICKER β `--sheet-mode zoned`.** The real fix for "our art has to be simple because of the greenscreen" is to stop giving a whole sheet one background. A **zoned** sheet is a grid of solid color **panels**, one item per panel, each panel's plate chosen against **that item**: a green frog on magenta beside a pink flower on green, in one image job. Each panel is keyed independently with its own color (read back off that panel's own corners, because models drift the hue they were asked for), and item art may then use **any palette at all β including the color of a different panel**. Bonus: names stop being guessed from reading order β panel N holds the item you asked for in panel N, so `--items` maps exactly, and `stickers.json` records each sticker's `panel` and `plate`. `--sheet-mode auto` (the default) zones a generation of 2+ named items and stays flat otherwise. Reading a zoned sheet you already have: `--zones auto` (default β recovers the grid from the sheet's own edges) or `--zones 3x2`.
|
|
220
|
+
- **The FLAT single-color sheet is still first-class β use it for a weaker image model.** Not every model can hold a color-block grid; a cheap or small one will paint one background regardless of the prompt. That path is fully supported: `--sheet-mode flat` asks for the classic one-plate sheet, and even if you asked for zones, keying **detects a model that ignored the grid** (a panel with no plate to remove, or one whose item filled it corner to corner) and **automatically re-keys the sheet as one plate**, telling you it did. So zoning can't strand you β worst case you're back on the simple method, still for $0.
|
|
221
|
+
- **Painterly, soft, furry or glassy art β `--refine`.** Chroma keying of any kind needs a crisp silhouette. When the art has genuinely soft edges (watercolor, fur, glow, glass, a cast shadow), add `--refine`: after the keyer locates each item, that item is re-cut from the **un-keyed** sheet with the local ONNX matting model (free, ~1β2s each), which is color-blind and handles soft mattes. It sanity-checks each matte and falls back to the keyed cut per item if the model didn't find a subject β flat vector art is exactly the case where matting fails and the chroma cut is better, so don't reach for `--refine` by default.
|
|
222
|
+
- **What the ART still has to honor: a crisp silhouette, sealed shapes, and gaps between items.** The connectivity key removes the old bans on hollow art and plate-colored fills, but three prompt rules are still load-bearing: **(1)** every object's **outer edge** is a clearly different color from its own plate and is **crisp** β no glow, blur, mist or drop shadow fading into the background; **(2)** enclosed areas are **sealed by the artwork**, because a gap in an outline lets the background flow in and the fill really does get keyed; **(3)** items are separated by a clear margin of plate β two touching items segment as ONE sticker. `cutout --generate`, `sticker-pack --generate`, `handoff image` and the `create-overlay` primitive **append the right clause for you** (a relaxed one for the smart keyer, the strict "closed, solidly filled, nothing in a near-plate shade" one when `--key-mode flat` is in play) β write it yourself only when prompting a generator directly. Both commands still report per-item `hole_pct`/`hollow` (console `β N% hollow`, `--json`, `stickers.json`); under the smart keyer a flagged item is *usually real* (a ring, frame, donut, or pieces with background between them), so it **warns, never blocks**. One stubborn item can always be lifted with `vidfarm mask --crop β¦` (ONNX matting ignores color entirely).
|
|
219
223
|
- **Transparent GIF is supported, for GIF-only surfaces.** `vidfarm sticker-pack β¦ --output-format gif` (stills) and `vidfarm remove-greenscreen <video> --gif` (animated) emit transparent GIFs. GIF alpha is **1-bit**, so edges go hard β fine for chat/forum/Notion sticker surfaces, worse than PNG/WebP/WebM for compositing on a timeline. Prefer PNG/WebP/WebM unless the destination only eats GIF.
|
|
220
224
|
|
|
221
225
|
**Explainer house style β the defaults to build with unless told otherwise.** **White background / light mode** (plain white stage, no gradients, no dark mode, no photo backdrop), **kinetic word-by-word captions** in dark ink on the light stage (`vidfarm captions generate --style word-pop --color "#111111" --active-color "#7C3AED" --background-style plain` β skip outlines/shadows, they're only needed over busy footage), and **female TTS narration** (`vidfarm tts --voice coral` on OpenAI β `nova` for energy, `sage` for calm; `Kore`/`Leda` on Gemini; any ElevenLabs voice via `vidfarm voices`). **Keep it clean and simple** β one idea on screen at a time, two or three cutouts per beat, one accent color, one font, lots of white space; remove before you add. **Illustrations default to simplicity**: flat vector, simple shapes, minimal detail, 2β3 flat colors, no baked-in text β simple art keys cleanly, trims tight, and stays on-style across the whole cast. State the defaults once so the director can override any of them. Full detail: recipe `recipes/cutout-graphics-for-explainers.md` (βHouse style β the explainer defaultsβ). **If the director takes the stage off white**, two things stop being optional: every sticker's **white die-cut rim** has to be stripped (on a dark stage it's a glaring halo and the most obvious bot-made artefact in the frame β recipe β βStickers on a DARK or photographic stageβ), and the caption hexes above stop applying β **caption colour, active-word colour and plate are chosen by measuring the composited background behind the caption band**, one treatment per video (`harnesses/short-form.HARNESS.md` β βCaption styling is MEASURED off the backgroundβ). Related: **on-screen text and captions must not say the same thing at once** β display text carries the argument, captions carry only what the screen doesn't show.
|
|
@@ -1638,10 +1642,11 @@ A video with replies gets shown again; a video with none dies at its first audie
|
|
|
1638
1642
|
- **The named omission** β *"I left one thing out on purpose. Ask me."* Converts what you couldn't fit into the reason to reply.
|
|
1639
1643
|
- **The soft disagree** β a true concession people want to argue with. Not ragebait if you actually believe it.
|
|
1640
1644
|
- **The specific question** β concrete always beats "thoughts?".
|
|
1645
|
+
- **The keyword comment** β *"Comment CLIPPER and I'll send you the breakdown."* Standard, allowed, and it works: the keyword is the reply the algorithm counts, and the word itself doubles as a filter. Keep the keyword topical (name the thing, not the money), promise something you actually hand over, and say what they get. What makes this beat go wrong is the *promise*, not the mechanic.
|
|
1641
1646
|
|
|
1642
|
-
**β οΈ Bait is the highest-compliance-risk beat in the video.** For money/health/appearance topics the
|
|
1647
|
+
**β οΈ Bait is the highest-compliance-risk beat in the video.** For money/health/appearance topics the risk is what you promise in exchange for the reply:
|
|
1643
1648
|
|
|
1644
|
-
- β *"Comment MONEY and I'll
|
|
1649
|
+
- β *"Comment MONEY and I'll show you how to make $10k/mo"* β the keyword is fine; the earnings claim attached to it is what's scam-coded and enforceable. Same line with a topical keyword and a deliverable ("Comment CLIPPER for the template") is fine.
|
|
1645
1650
|
- β *"How much do you want to make a month?"* β invites an earnings-claim thread you now own.
|
|
1646
1651
|
- β *"Follow for part two"* β breaks the standalone rule.
|
|
1647
1652
|
- β Fake controversy, ragebait, or a deliberate error to farm corrections. Works once, costs the positioning permanently.
|
|
@@ -2278,11 +2283,11 @@ The licensed harness also carries the **generative build workflow** guidance (ch
|
|
|
2278
2283
|
| `vidfarm generate <image\|video> --prompt "β¦"` | `POST /api/v1/primitives/{images,videos}/generate` (polls job) | generate AI media β finished URL |
|
|
2279
2284
|
| `vidfarm inpaint <image> --mask <png> --prompt "β¦" [--region "label=β¦"] [--ref β¦] [--out <f>]` | `POST /api/v1/primitives/images/inpaint` (polls job) | masked image EDIT β replace ONLY the transparent-mask region, keep everything else (devcli twin of the /inpaint page) |
|
|
2280
2285
|
| `vidfarm create-overlay "<subject>" [--key-color #00FF00] [--aspect-ratio 1:1] [--place <dir>] [--out <f>]` | `POST /api/v1/primitives/images/create-overlay` (polls job) | **Vox-style** transparent OVERLAY β AI image on a forced key-color background, chroma-keyed out in one job β ready-to-composite transparent PNG |
|
|
2281
|
-
| `vidfarm remove-greenscreen <image\|video> [--preset green\|blue\|white\|black\|digital-green\|magenta] [--key-color #00FF00] [--tolerance 0.3] [--local] [--gif] [--out <f>]` | `POST /api/v1/primitives/remove-greenscreen` (polls job) | chroma-key a FLAT solid background β transparent PNG/WebP (image) or WebM/VP9-alpha (video); auto-detects media kind. `--local` runs it FREE in-process (sharp/ffmpeg, no wallet); default cloud is billed at real compute Γ 1.2. **`--gif` writes a transparent GIF instead** (ANIMATED for a clip; `--gif-fps`/`--gif-width`/`--gif-alpha`) β local-only, 1-bit alpha, for GIF-only sticker surfaces; prefer PNG/WebP/WebM for compositing. Aliases: `greenscreen`, `remove-background-greenscreen`. |
|
|
2286
|
+
| `vidfarm remove-greenscreen <image\|video> [--preset green\|blue\|white\|black\|digital-green\|magenta] [--key-color #00FF00] [--tolerance 0.3] [--local] [--gif] [--out <f>]` | `POST /api/v1/primitives/remove-greenscreen` (polls job) | chroma-key a FLAT solid background β transparent PNG/WebP (image) or WebM/VP9-alpha (video); auto-detects media kind. `--local` runs it FREE in-process (sharp/ffmpeg, no wallet); default cloud is billed at real compute Γ 1.2. **`--gif` writes a transparent GIF instead** (ANIMATED for a clip; `--gif-fps`/`--gif-width`/`--gif-alpha`) β local-only, 1-bit alpha, for GIF-only sticker surfaces; prefer PNG/WebP/WebM for compositing. **`--smart`** (IMAGE + local only) swaps the flat chromakey for the connectivity keyer `cutout`/`sticker-pack` use, so plate-colored detail inside the subject and hollow/outline art survive. Aliases: `greenscreen`, `remove-background-greenscreen`. |
|
|
2282
2287
|
| `vidfarm dedupe <video\|image\|url> [--preset light\|standard\|strong] [--variants N] [--seed <s>] [--zoom/--rotate/--skew/--speed/--saturation/--hue/--noise/--flip] [--local\|--cloud] [--out <f>\|--out-dir <d>]` | **local, free, ffmpeg-only** by default (no job); `--cloud` = `POST /api/v1/primitives/media/dedupe` (polls job) | **DEDUPLICATION β the publish-safety pass.** Makes a finished render read as a NEW upload to a platform's duplicate-content detector, invisibly to a viewer. Default preset `standard` = skew 2%, zoom 3%, rotate 2Β°, speed +2%, saturation +4%, plus contrast/brightness/hue/grain, a container-metadata strip and a per-variant CRF walk. **Runs on the EXPORTED file β never re-render for this.** `--variants N` mints N copies that differ from the original AND from each other (jittered magnitudes, alternating signs), one per account/posting slot; `--seed` makes a batch reproducible. A rotate forces a bigger centre-crop to hide the black corners (~6.7% on a tall frame at 2Β°) and says so β pass `--rotate 0` when framing matters more. `--flip` is the strongest single knob but visibly reverses on-screen text. **Ask the operator whether they want this BEFORE publishing or bulk-producing.** Aliases: `dedup`, `deduplicate`, `uniquify`. |
|
|
2283
|
-
| `vidfarm cutout <image\|url> [--generate "<prompt>"] [--preset green] [--pad <px>] [--alpha-threshold <n>] [--no-trim] [--output-format png\|webp] [--out <f>]` | **local, free, ffmpeg-only** (no job) β key + `alphaextract`/`cropdetect` trim | **The transparent explainer-STICKER maker.** Keys out the flat plate **and then shrinks the canvas to the cutout's true min width/height** (a 1024Β² mostly-empty plate β a snug sticker whose pixel size IS the subject) so you can scale/position it precisely. `--generate` AI-generates the graphic first on a matching chroma plate (that step is the billed image primitive), then keys+trims in one shot; without it, keys+trims a file/url you already have. **IMAGE-only** (a moving subject has no single bounding box β key a clip with `remove-greenscreen`). Prefer this over `create-overlay` locally: same idea, but free and auto-trimmed. `--pad` keeps transparent breathing room; `--json` reports final `width`/`height`/`area_reduced_pct`,
|
|
2288
|
+
| `vidfarm cutout <image\|url> [--generate "<prompt>"] [--preset green] [--pad <px>] [--alpha-threshold <n>] [--no-trim] [--output-format png\|webp] [--out <f>]` | **local, free, ffmpeg-only** (no job) β key + `alphaextract`/`cropdetect` trim | **The transparent explainer-STICKER maker.** Keys out the flat plate **and then shrinks the canvas to the cutout's true min width/height** (a 1024Β² mostly-empty plate β a snug sticker whose pixel size IS the subject) so you can scale/position it precisely. `--generate` AI-generates the graphic first on a matching chroma plate (that step is the billed image primitive), then keys+trims in one shot; without it, keys+trims a file/url you already have. **IMAGE-only** (a moving subject has no single bounding box β key a clip with `remove-greenscreen`). Prefer this over `create-overlay` locally: same idea, but free and auto-trimmed. Keys by CONNECTIVITY by default (`--key-mode smart`): the plate is flood-filled in from the frame edge, so plate-colored detail inside the subject and hollow/outline art survive, and the plate is un-mixed out of each edge pixel individually instead of by a global `despill`. `--key-mode flat` is the old plain chromakey. `--pad` keeps transparent breathing room; `--json` reports final `width`/`height`/`area_reduced_pct`, `key_mode`, `protected_px` (plate-colored pixels kept inside the art), plus `hole_pct`/`hollow` (under the smart keyer an enclosed hole is usually real art, so it warns only). Alias: `sticker`. See recipe `cutout-graphics-for-explainers.md`. |
|
|
2284
2289
|
| `vidfarm mask <image\|url> [--crop x,y,w,h] [--flat <hex>] [--pad <px>] [--alpha-threshold <n>] [--no-trim] [--output-format png\|webp] [--keep-region <f>] [--out <f>]` | **local, free** (no job) β ffmpeg crop + ONNX matting (or ffmpeg chroma-key) + `cropdetect` trim | **Lift an illustration OUT of an image you already have** (infographic / poster / marketing graphic / brand sheet / screenshot) β snug transparent PNG, the same reusable explainer sticker `cutout` makes but with **$0 and zero AI generation** β the cost-saving move whenever source art exists. `--crop x,y,w,h` (pixels **or** %) isolates ONE element from a multi-illustration source before masking (re-run with different rects to grab each). Background removed by **local ONNX matting** (any/busy background) by default, or **`--flat <hexcolor>`** chroma-keys a solid fill for crisper edges (an infographic's cream/white paper); then trims to the subject's true min width/height. **IMAGE-only** (matte a clip with `remove-background`). Aliases: `isolate`, `extract`. See recipe `cutout-graphics-for-explainers.md` β "Mask from an image you already have". |
|
|
2285
|
-
| `vidfarm sticker-pack [sheet\|url] [--generate "<theme>"] [--items "a,b,c"] [--count <n>] [--dry-run] [--gap <pct>] [--min-area <pct>] [--output-format png\|webp\|gif] [--out-dir <d>]` | **local, free, ffmpeg-only** (no job; only `--generate` bills, ONCE for the whole set) β key + alpha-channel segmentation + per-item trim | **The STICKER-PACK maker β the answer whenever a director asks for "a sticker pack" / prop set / icon set.** A pack is ONE greenscreen sheet holding every item, keyed once and then masked apart: 1/N the cost of N `cutout` calls, and the only way a cast stays on-style. Finds each item **automatically** by segmenting the keyed sheet's alpha into connected islands β no hand-measured `--crop` rects β and writes one snug transparent file per item (named from `--items`, reading order) plus a `stickers.json` manifest. `--dry-run` prints the detected boxes first; `--gap` merges (lower) or splits (raise) items that came out joined/broken; items have **no maximum size** β a full-frame landscape/backdrop is as valid a sticker as a 3% icon. **
|
|
2290
|
+
| `vidfarm sticker-pack [sheet\|url] [--generate "<theme>"] [--items "a,b,c"] [--count <n>] [--dry-run] [--gap <pct>] [--min-area <pct>] [--output-format png\|webp\|gif] [--out-dir <d>]` | **local, free, ffmpeg-only** (no job; only `--generate` bills, ONCE for the whole set) β key + alpha-channel segmentation + per-item trim | **The STICKER-PACK maker β the answer whenever a director asks for "a sticker pack" / prop set / icon set.** A pack is ONE greenscreen sheet holding every item, keyed once and then masked apart: 1/N the cost of N `cutout` calls, and the only way a cast stays on-style. Finds each item **automatically** by segmenting the keyed sheet's alpha into connected islands β no hand-measured `--crop` rects β and writes one snug transparent file per item (named from `--items`, reading order) plus a `stickers.json` manifest. `--dry-run` prints the detected boxes first; `--gap` merges (lower) or splits (raise) items that came out joined/broken; items have **no maximum size** β a full-frame landscape/backdrop is as valid a sticker as a 3% icon. **The key is CONNECTIVITY-based (`--key-mode smart`, the default):** the plate is flood-filled inward from the sheet's edge and only background that REACHES the edge is deleted, so plate-colored detail inside an item, and an outline shape whose interior is bare plate, both survive; edge pixels get the plate un-mixed out of them individually (real alpha math, better than a global `despill`). `--key-mode flat` is the old plain chromakey β the simple fallback and the way to match a cloud render exactly. **ONE PLATE PER STICKER (`--sheet-mode zoned`):** generates a grid of solid color PANELS, one item per panel, each panel's plate picked against that item (green frog on magenta beside a pink flower on green), keyed panel-by-panel with the color read back off that panel's own corners β item art may then use any palette including other panels' colors, and names map to PANELS instead of reading order (`panel`/`plate` land in `stickers.json`). `--sheet-mode auto` (default) zones a generation of 2+ named items; `--sheet-mode flat` forces the classic one-color sheet for a weaker model, and if a model ignores the grid anyway the keyer detects it (a panel with no plate, or one whose item filled it corner to corner) and **re-keys the sheet as one plate automatically**. Read a zoned sheet you already have with `--zones auto` (default) or `--zones 3x2`. **`--refine`** re-cuts each located item from the UN-keyed sheet with the local ONNX matting model (free, ~1β2s each) for painterly/soft/furry/glassy art, falling back per item to the keyed cut when the matte comes back empty or fully opaque. **Plate color is still chosen for you** when generating flat (green β magenta β blue β black β white) and detected off an existing sheet. Per-item `holes`/`hole_pct`/`hollow` are still reported (console `β N% hollow` at β₯20%, `--json`, `stickers.json`) β under the smart keyer a flag usually means real art (ring/frame/donut), so it **warns, never blocks**; lift a stubborn item with `vidfarm mask --crop β¦`. `--output-format gif` emits 1-bit-alpha GIFs for GIF-only surfaces. IMAGE-only. Aliases: `stickers`, `sticker-sheet`. See recipe `cutout-graphics-for-explainers.md` β "A sticker pack". |
|
|
2286
2291
|
| `vidfarm tts "β¦" [--style "β¦"] [--voice <v>] [--out <file>]` | (LOCAL-FIRST: your own OPENAI/GEMINI/OPENROUTER_API_KEY β audio file on disk; `--cloud` = `POST /api/v1/primitives/audio/speech` + poll, ElevenLabs on the platform key by default, `--own-key` for yours) | text β narration audio; `--cloud --voice <voice_id>` picks an ElevenLabs voice |
|
|
2287
2292
|
| `vidfarm music "<prompt>" [--length <sec>] [--out <f>] [--own-key]` | `POST /api/v1/primitives/music/generate` (polls job) | prompt β music track (ElevenLabs; platform key + wallet by default, `--own-key` for yours) |
|
|
2288
2293
|
| `vidfarm voices [--sample] [--search "β¦"] [--free\|--all] [--own-key] [--limit N]` | `GET /api/v1/primitives/audio/voices` | **Browse AND sample narration voices.** Default roster = the premium ElevenLabs catalog reached through **vidfarm's own ElevenLabs connection** β the user needs no ElevenLabs account, API key, or subscription; narration is billed as vidfarm wallet credits (pennies each). `--free` = the $0 local Kokoro roster (`--all` = both). `--sample` writes listenable clips to `./voice-samples` (`--sample-count`, `--sample-out`, `--sample-text`) and is **free on both tiers** β premium samples are ElevenLabs' own preview clips, free samples render locally β so it's safe in `minimize`. `--search` filters by name/labels/description. **In interactive mode play the samples and let the USER pick**; autonomous = default a voice and still say they can choose. `--own-key` lists the customer's own ElevenLabs account instead. |
|
|
@@ -2311,7 +2316,7 @@ The licensed harness also carries the **generative build workflow** guidance (ch
|
|
|
2311
2316
|
| `vidfarm whoami` | `GET /api/v1/user/me` | who am I (also prints the active cost mode) |
|
|
2312
2317
|
| `vidfarm cost-mode [minimize\|hybrid\|rich-ai\|pure-videogen]` | (local `~/.vidfarm/cost-mode.json`) | show/set the money-saving preference every billed command respects; no arg = show + explain each; `--clear` forgets it |
|
|
2313
2318
|
| `vidfarm mode [interactive\|autonomous]` | local (`~/.vidfarm/interaction-mode.json`) | **The SECOND preference axis β ask it alongside cost mode.** Is the human in the loop? `interactive` = at checkpoints you hand them a copy-paste brief (an image prompt for a FREE web generator; a keyword list for sourcing clips) and they hand files back β usually BETTER output, and in `minimize` the only way to get custom art at all. `autonomous` = you finish solo within the budget. Independent of cost mode: every cost mode runs either way. No arg prints the pair + the explainer to relay; `--clear` forgets; per-run `--interactive`/`--autonomous`. Aliases: `interaction-mode`, `interaction`. |
|
|
2314
|
-
| `vidfarm handoff image --theme "<what>" [--items "a,b,c"] [--style β¦] [--single]` | local (pure text) | **The interactive-mode IMAGE brief.** Prints the exact prompt, the numbered steps, the free tools (meta.ai / ChatGPT / Gemini / HF Spaces) and the follow-up command. Defaults to a **sticker pack**: ONE sheet holding every item on a chroma plate β `vidfarm sticker-pack` splits it for $0. Picks a plate the art won't collide with (green art β magenta plate), spells out the
|
|
2319
|
+
| `vidfarm handoff image --theme "<what>" [--items "a,b,c"] [--style β¦] [--single]` | local (pure text) | **The interactive-mode IMAGE brief.** Prints the exact prompt, the numbered steps, the free tools (meta.ai / ChatGPT / Gemini / HF Spaces) and the follow-up command. Defaults to a **sticker pack**: ONE sheet holding every item on a chroma plate β `vidfarm sticker-pack` splits it for $0. Picks a plate the art won't collide with (green art β magenta plate), spells out what the local keyer actually needs (a crisp silhouette in a different color from the plate, sealed shapes, clear gaps between items β hollow art and plate-colored detail INSIDE a shape are fine now), and carries that `--key-color` into the follow-up. `--single` for one subject. `--zoned` asks instead for a color-block sheet (one panel colour per item) and hands back a `--zones RxC` follow-up β worth it when the pack's own colors fight one plate, but leave it off for a free consumer tool that may not follow a grid. |
|
|
2315
2320
|
| `vidfarm handoff raws --keywords "a,b" [--platforms tiktok,youtube] [--count N] [--purpose "β¦"]` | local (pure text) | **The interactive-mode CLIP-SOURCING brief** β the bottom rung of the sourcing ladder (browser control β `clipper`/`raws scan --cloud` β public raws β the human). Prints what to search, how to download (a Google *search* for a downloader, never a link that rots), and the import command for when the folder is ready. |
|
|
2316
2321
|
| `vidfarm storyboard [dir] [--init] [--frames "Title\|scene,β¦"] [--json]` | local (`STORYBOARD.md` / `SCRIPT.md`) | **The plan pass, and a core part of the composition format.** Scaffolds/reads the project's `STORYBOARD.md`: ordered frames with `duration`/`status`/`src`/`scene`/`voiceover`. The Vidfarm editor renders this file in its **Storyboard** view (contact sheet + per-frame comments + `outline β built β animated` progress), so it's the cheapest place to get a director's approval before building. Not to be confused with `vidfarm sequence` (which GENERATES storyboard images for the pure-videogen pipeline). Alias: `plan`. |
|
|
2317
2322
|
| `vidfarm wallet [--job <id>\|--tracer <t>] [--limit <n>]` | `GET /api/v1/user/me/wallet` | cost log: balance + lifetime spend + recent charges. `--job <renderJobId>` prints **what that one video cost** (sums its charges); `--tracer <t>` sums a tracer. Cloud-only; readable on the free plan too (shows $0.00). Aliases: `spend`, `costs` |
|
|
@@ -3289,28 +3294,58 @@ Out comes `./stickers/sticker-01-red-barn.png`, `sticker-02-tractor.png`, β¦ ea
|
|
|
3289
3294
|
- `--gap <pct>` (default 1.2) β how far apart two islands must be to count as separate items. **Two items came out as one sticker β lower it** (or ask for wider spacing on the sheet). **One item came out split in two β raise it** (its parts, e.g. a floating antenna or a dotted arrow, weren't bridged).
|
|
3290
3295
|
- `--min-area <pct>` (default 0.15) β drops key speckle. There is **no maximum** β see the size note below.
|
|
3291
3296
|
- `--preset`/`--key-color` β match the plate (default `#00FF00`). `--pad`, `--alpha-threshold`, `--output-format png|webp|gif`, `--prefix`, `--max-items`, `--keep-plate`/`--keep-sheet` behave like `cutout`'s.
|
|
3297
|
+
- `--sheet-mode auto|zoned|flat`, `--zones auto|off|RxC`, `--zone-cols <n>`, `--key-mode smart|flat`, `--refine` β how the plate(s) are laid out and removed. All four are explained below ("How the key actually works now").
|
|
3292
3298
|
- Stubborn item? Fall back to one hand-measured `vidfarm mask ./sheet.png --crop x,y,w,h --flat "#00FF00"` for that one; the rest of the pack still comes from `sticker-pack`.
|
|
3293
3299
|
|
|
3294
|
-
**
|
|
3300
|
+
**How the key actually works now β CONNECTIVITY, not color matching.** This is the thing to internalize, because it removes the constraint that used to force sticker art to stay flat and simple. `sticker-pack` and `cutout` do **not** delete every pixel that looks like the plate. They score each pixel's distance to its plate color, then **flood-fill inward from the edge of the sheet** through plate-ish pixels, and delete only what the fill **reaches**. Consequences, all of them useful:
|
|
3295
3301
|
|
|
3296
|
-
- **
|
|
3297
|
-
- **
|
|
3302
|
+
- **Plate-colored art survives if it's inside the item.** A green leaf on a green sheet, a `#00FF00` eye, a highlight in the plate hue β unreachable from the sheet edge, therefore not background, therefore kept. The console tells you when it mattered: *"kept 10,000 plate-colored pixels INSIDE the art that a flat key would have punched out."*
|
|
3303
|
+
- **Outline / line-art shapes keep their middles.** The old "rim around a see-through hole" failure is a property of the flat chromakey, not of keying. An enclosed interior can't be reached by the fill.
|
|
3304
|
+
- **Edges come out clean.** Boundary pixels get a real coverage estimate and the plate is **un-mixed out of each one individually** (`art = (C β (1βΞ±)Β·plate)/Ξ±`, stored as straight alpha), so there's no green fringe. That's strictly better than ffmpeg's global `despill`, which rebalances every pixel and discolors plate-hued art in the interior.
|
|
3305
|
+
- **`--key-mode flat` brings the old behaviour back.** It's the cloud primitive's exact filter chain β use it to reproduce a cloud render bit-for-bit, or as a simple fallback.
|
|
3298
3306
|
|
|
3299
|
-
|
|
3307
|
+
What the key still can't do for you: an item whose **outer edge** is the plate color dissolves into it, and anything that **fades** into the plate (soft glow, blur, drop shadow) has no crisp silhouette to find.
|
|
3300
3308
|
|
|
3301
|
-
**
|
|
3309
|
+
**ONE PLATE COLOR PER STICKER β `--sheet-mode zoned`.** The silhouette constraint is what "one plate per sheet" makes painful: the more items on the sheet, the more of the palette is off-limits to all of them. So stop giving the sheet one background. A **zoned** sheet is a grid of solid color **panels**, one item per panel, each panel's plate chosen against **that item**:
|
|
3302
3310
|
|
|
3303
|
-
|
|
3311
|
+
```
|
|
3312
|
+
# 6 items β a 3Γ2 grid of color panels, each item's plate picked against its own art
|
|
3313
|
+
vidfarm sticker-pack --generate "pond life, flat vector" \
|
|
3314
|
+
--items "green frog,pink lotus,blue heron,white pebble,yellow reed,orange koi" \
|
|
3315
|
+
--sheet-mode zoned --out-dir ./stickers
|
|
3316
|
+
|
|
3317
|
+
# A zoned sheet from a web tool: recover the panels from the sheet's own edges
|
|
3318
|
+
vidfarm sticker-pack ./sheet.png --zones auto # (this is the default)
|
|
3319
|
+
vidfarm sticker-pack ./sheet.png --zones 3x2 # or declare the grid you asked for
|
|
3320
|
+
```
|
|
3321
|
+
|
|
3322
|
+
- The green frog sits on magenta while the pink lotus sits on green β **in the same image job**. Item art may use **any** palette, including the colors of the *other* panels.
|
|
3323
|
+
- Each panel is keyed independently, with its color read back off **that panel's own corners** (image models drift the exact hue they were told, so the sheet is the source of truth, not the prompt).
|
|
3324
|
+
- **Names stop being guessed.** On a flat sheet, `--items` is matched to items in reading order, which goes off-by-one the moment two items merge. On a zoned sheet, panel *N* holds the item you asked for in panel *N* β so the mapping is exact, and `stickers.json` records each sticker's `panel` and `plate`.
|
|
3325
|
+
- `--sheet-mode auto` (the default) zones a generation of 2+ named items and stays flat otherwise. `--zone-cols <n>` forces the grid width.
|
|
3326
|
+
|
|
3327
|
+
**The FLAT one-color sheet is still first-class β reach for it with a weaker image model.** A cheap or small model will paint one background no matter how the grid is described. That's fine and fully supported:
|
|
3328
|
+
|
|
3329
|
+
- `--sheet-mode flat` asks for the classic single-plate sheet (and `--key-mode smart` still applies, so hollow art and plate-colored interiors are still safe).
|
|
3330
|
+
- If you asked for zones and the model ignored them, **keying detects it and re-keys the sheet as one plate automatically** β either because a "panel" had no plate to remove, or because its item filled the panel corner to corner (so the item's own color read as the plate). It says so on the console and in `stickers.json` (`key_note`). Zoning can't strand you.
|
|
3331
|
+
|
|
3332
|
+
**Plate color is still chosen for you on a flat sheet.** `--generate` reads the subject and moves the plate off any hue it mentions β green (`#00FF00`) β magenta (`#FF00FF`) β blue (`#0047BB`) β black β white β and prints which it chose and why; say it back to the director when it moves (*"your items are mostly green, so I generated them on a magenta plate"*). Splitting a sheet you already have, the plate is read off the sheet itself, so a red/purple/blue sheet from a free web generator just works. Pin it with `--key-color "#FF00FF"` / `--preset magenta`, or `--no-auto-key` for plain green.
|
|
3333
|
+
|
|
3334
|
+
**Soft, painterly, furry or glassy art β `--refine`.** Every chroma key needs a crisp silhouette, so watercolor edges, fur, glow, glass and cast shadows are out of scope for the keyer no matter how clever the fill is. `--refine` handles them: the keyer's job shrinks to *locating* each item, and the item is then re-cut from the **un-keyed** sheet with the local ONNX matting model (free, ~1β2s each), which ignores color entirely and produces a genuine soft matte.
|
|
3335
|
+
|
|
3336
|
+
```
|
|
3337
|
+
vidfarm sticker-pack ./painterly-sheet.png --refine --out-dir ./stickers
|
|
3338
|
+
```
|
|
3339
|
+
|
|
3340
|
+
It's checked, not trusted: the matte is measured, and if it came back **empty** or **fully opaque** (the model didn't see a subject) that item keeps its keyed cut and the console says so. Flat vector art is exactly where matting fails and the chroma cut is better β so **don't use `--refine` by default**, only when the art is genuinely soft.
|
|
3304
3341
|
|
|
3305
|
-
|
|
3342
|
+
**What the prompt still has to ask for.** Three rules survive, and they're all about geometry rather than color:
|
|
3306
3343
|
|
|
3307
|
-
|
|
3344
|
+
> Every object's OUTER EDGE must be a clearly different color from its own panel's background, and crisp β no glow, blur, mist, drop shadow or reflection fading from the object into the background. Every enclosed area must be sealed by the artwork itself, not open to the background. Keep a clear margin of plain background between objects and around the sheet edge; nothing touching, overlapping or connected.
|
|
3308
3345
|
|
|
3309
|
-
|
|
3346
|
+
`cutout --generate`, `sticker-pack --generate`, `vidfarm handoff image` and the `create-overlay` REST primitive append the right clause for you β the relaxed one above for the smart keyer, and the strict "closed, solidly filled shapes, nothing in a near-plate shade, fully opaque" clause when `--key-mode flat` is in play. **Write it yourself only when you prompt a generator directly** (a free web tool by hand, or your own `POST /api/v1/primitives/images/generate` call).
|
|
3310
3347
|
|
|
3311
|
-
- **
|
|
3312
|
-
- If the fill was merely *close* to the plate rather than absent, a lower `--tolerance` can rescue the sheet you already have. Nothing rescues a genuinely empty interior.
|
|
3313
|
-
- Last resort for one stubborn item: `vidfarm mask ./sheet.png --crop x,y,w,h` β ONNX matting doesn't care what color the fill is, so it lifts art the chroma key can't.
|
|
3348
|
+
**The hollow check still runs, and it means something different now.** `sticker-pack` and `cutout` measure the transparent area **fully enclosed by an item's own art** and report `hole_pct` (plus `holes`, `hollow: true` at β₯20%) in `--json`, in `stickers.json`, and as a `β N% hollow` console flag. Under the smart keyer an enclosed hole **can't** have been keyed away, so a flag is usually *real* art β a ring, donut, picture frame, letter "O", or an item drawn as separate pieces with background showing between them. It warns, never blocks. If a flagged item genuinely looks wrong, the shape's fill is **open** to the background through a gap in its outline; ask the prompt for sealed shapes. Last resort for one stubborn item: `vidfarm mask ./sheet.png --crop x,y,w,h` β ONNX matting doesn't care what color anything is.
|
|
3314
3349
|
|
|
3315
3350
|
**Generation is the failure point, not the cutting.** The sheet prompt is auto-appended with the important instruction β *every item fully separated by clear plate-colored background, nothing touching or overlapping, wide margins, no text, no shadows, one consistent style* β because **touching items segment as one sticker**. If a pack comes back merged, re-run the generation asking for more spacing before you fight the `--gap` knob.
|
|
3316
3351
|
|