@officexapp/vidfarm-devcli 0.21.57 → 0.21.59
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/vidfarm/SKILL.md +2 -2
- package/.agents/skills/vidfarm/recipes/retheme-template.md +6 -5
- package/.agents/skills/vidfarm/references/core-workflows.md +4 -0
- package/.agents/skills/vidfarm/references/editor-workflows.md +25 -0
- package/SKILL.director.md +37 -7
- package/SKILL.md +7 -2
- package/dist/src/cli.js +7 -1
- package/dist/src/devcli/clipper-run.js +8 -0
- package/dist/src/devcli/marketplace-gigs.js +307 -4
- package/dist/src/devcli/proof-verify.js +465 -0
- package/experimental/flash-harness.md +142 -18
- package/experimental/meme-recaption.md +701 -37
- package/experimental/sticker-slideshow-tips.md +511 -86
- package/marketplace.md +406 -11
- package/package.json +9 -1
- package/update.md +21 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: vidfarm
|
|
3
|
-
skill_version: 0.21.
|
|
3
|
+
skill_version: 0.21.59
|
|
4
4
|
description: Use Vidfarm as a director. Run a strategy **consultation** (the `brainstorm/*` chain — cold-start interview, awareness stages, persuasive angles, hooks, product placement). Answer "give me content ideas" / "what should I post" / "I need 30 videos this month" from the bundled idea banks (50 content frames x 5 awareness stages x 44 problem angles). Browse/add inspiration videos, browse the free public raws catalog BY CATEGORY (curated shelves like scroll-stoppers/greenscreen/reaction — the cheapest way to source footage for one video, and a ready-made clip pool for bulk scripting N variants), fork a template into a composition, edit it in the Trackpad Editor (timeline-based like Premiere/DaVinci), auto-decompose source video into scenes, render to MP4, approve into a shareable post, and schedule it. Includes login, provider keys, discovery, versioning, uploads/downloads, and billing. Every step is available as raw REST; `vidfarm-devcli` wraps those routes and composes the file-backed scripting flows.
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -572,7 +572,7 @@ The File Index above says what each file *is*; this says which one a given ask m
|
|
|
572
572
|
5b. If the task is an **explainer built from cutout/sticker art** — flat illustrations on a stage, a sticker sheet, keyed art, “make it look like those animated explainer videos” — read `recipes/cutout-graphics-for-explainers.md`. It carries the house style, the sheet→sticker pipeline, and the dark-stage rules that are easy to get wrong.
|
|
573
573
|
5c. If the task is **introducing a product a stranger has never heard of** — a client's URL turned into a 20–30s "what is this?" video, a launch/brand-intro clip, or a batch of N customer URLs → N videos that must not look alike — read `harnesses/product-explainer.HARNESS.md`. It is the format with the single most expensive defect in the catalog (the product never plainly named in the first 5s, which costs a VO re-record to fix), plus the simple-open text-run count, the sticker dosage, and the anti-convergence assignment method. Use `product-demo` instead when you actually have the UI on screen.
|
|
574
574
|
6. If the task explicitly asks for a primitive or needs specialized generation/transcription work, read `references/primitives.md`.
|
|
575
|
-
7. If the task is the MARKETPLACE (ordering videos from specialist agents, or running your own two vending machines): browsing is web-only for paying customers — send the human to https://vidfarm.cc/marketplace, never render it locally. **`GET /api/v1/user/me/marketplace` hands you the customer's own Dollar Platoon API key** (paid plans only), so an agent with a `vidfarm-api-key` needs nothing copied out of Settings. Orders plus the four quick tasks — check a machine for new proofs, approve/reject one, add a task, ring the bell on the feed — are worked examples in `references/core-workflows.md` (§ Marketplace, § Your Dollar Platoon key). **When you ring the bell, the notification MUST point at the machine's reusable INVITE link (`…/gig/<id>/join?invite=<token>`)** — that is what a gigworker taps to join and pitch. The gig record's own `invite_url` is tokenless and refuses the join, so never publish it; `POST /api/v1/marketplace/buyer/ring-bell` resolves the right link for you and returns it as `destinationUrl`. Everything deeper on a gig (mailboxes, the queue, per-task pricing, payouts, wallets, reputation) is Dollar Platoon's own API: **read `https://dollarplatoon.com/skill.md`**, its accurate live index, or install it with `npx skills add https://github.com/OfficeXApp/dollarplatoon-skill` — the same way FlockPoster work beyond scheduling needs `npx skills add https://github.com/OfficeXApp/flockposter-skill`. Dollar Platoon authenticates on `x-api-key` ONLY; a Bearer token 401s as "Missing x-api-key header" before the key is read.
|
|
575
|
+
7. If the task is the MARKETPLACE (ordering videos from specialist agents, or running your own two vending machines): browsing is web-only for paying customers — send the human to https://vidfarm.cc/marketplace, never render it locally. **`GET /api/v1/user/me/marketplace` hands you the customer's own Dollar Platoon API key** (paid plans only), so an agent with a `vidfarm-api-key` needs nothing copied out of Settings. Orders plus the four quick tasks — check a machine for new proofs, approve/reject one, add a task, ring the bell on the feed — are worked examples in `references/core-workflows.md` (§ Marketplace, § Your Dollar Platoon key). **When you ring the bell, the notification MUST point at the machine's reusable INVITE link (`…/gig/<id>/join?invite=<token>`)** — that is what a gigworker taps to join and pitch. The gig record's own `invite_url` is tokenless and refuses the join, so never publish it; `POST /api/v1/marketplace/buyer/ring-bell` resolves the right link for you and returns it as `destinationUrl`. Everything deeper on a gig (mailboxes, the queue, per-task pricing, payouts, wallets, reputation) is Dollar Platoon's own API: **read `https://dollarplatoon.com/skill.md`**, its accurate live index, or install it with `npx skills add https://github.com/OfficeXApp/dollarplatoon-skill` — the same way FlockPoster work beyond scheduling needs `npx skills add https://github.com/OfficeXApp/flockposter-skill`. Dollar Platoon authenticates on `x-api-key` ONLY; a Bearer token 401s as "Missing x-api-key header" before the key is read. **On the earning side, never submit a proof without the sanity check first:** `vidfarm gigs verify-proof --proof <url> --clean-master ./final-clean.mp4` needs no key, loads every proof url the way a stranger's browser would, and exits non-zero on a dead link, a 403 bucket, an error page served as `video/mp4`, or an **expiring presigned url** — then checks the watermarked cut is the public half and the clean master the sealed one. `vidfarm gigs submit` runs it too and refuses a failing proof. **A submitted proof is not one-way:** `vidfarm gigs withdraw <gig> <proof>` pulls a still-`pending` proof back to a private draft (stopping the review clock and hiding it from the buyer) and `gigs send` re-sends it with a fresh window — but withdrawal is closed the moment the buyer approves or rejects, so it is a repair for a bad link or a missing `private_note`, never a substitute for reviewing the cut first. `gigs draft` / `drafts` / `edit-draft` / `discard` work the same lifecycle from the other end. The whole earning loop is `https://vidfarm.cc/agentic-clipper.md`.
|
|
576
576
|
|
|
577
577
|
## Non-Negotiables
|
|
578
578
|
|
|
@@ -5,13 +5,14 @@ Use this when the user wants to keep the format’s feel but replace the subject
|
|
|
5
5
|
1. Read `references/editor-workflows.md`.
|
|
6
6
|
2. Fetch `video-context.json` and `editor-harness.json` first.
|
|
7
7
|
3. State the plan in the three axes vocabulary: scenes, audio, text; SWAP vs REPLACE for each.
|
|
8
|
-
4.
|
|
9
|
-
5.
|
|
8
|
+
4. **Audit every element before you touch one.** The fork is somebody else's *finished* video, so list its layers (`vidfarm pull <forkId> --json` → `.layers[]`, plus `grep -o 'data-src="[^"]*"' composition.html | sort -u`) and write one row per element into `./work/ADAPTATION.md`: KEEP / REPLACE / CUT, why, what replaced it. **KEEP is the verdict that needs a reason.** Structure stays (beat count and order, `start`/`duration`, cut rhythm, transitions, caption identity); meaning goes (voiceover, music, caption words, on-screen titles and prices and stats, actor clips, product shots and screenshots, stickers that name a thing, the picture behind a background, and every logo, @handle, URL and watermark). See `references/editor-workflows.md` → *Before the axes: audit every element*. The REPLACE rows are your sourcing list for step 6.
|
|
9
|
+
5. Preserve the hook structure, cut rhythm, emotional punch, and important scenes flagged by the harness. **Read `references/hooks-and-virality.md` before rewriting the opening line or the retention beat** — `viral_dna.hook`/`retention`/`payoff` name the source's four charges, and rebuilding each one for the new subject (rather than flattening the loop into a product statement) is the whole job.
|
|
10
|
+
6. Source footage for every REPLACE row, in this order:
|
|
10
11
|
- My Files or existing raws
|
|
11
12
|
- a raws hunt from a long-form source
|
|
12
13
|
- AI image generation
|
|
13
14
|
- AI video generation only with permission
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
7. Rebuild captions and narration so timing, cadence, and joke structure survive the subject change.
|
|
16
|
+
8. Render, verify, then approve and schedule only after the director is happy. Report the audit counts — kept / replaced / cut — with it.
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
Two failure modes to avoid: flattening the format by swapping words but losing the timing, sound, or payoff beat — and the opposite, swapping the words and leaving everything else, so the source brand's voice, screenshots, stickers or handle ship inside the director's video.
|
|
@@ -369,6 +369,10 @@ curl -s -X PATCH -H "x-api-key: $DP" -H "content-type: application/json" \
|
|
|
369
369
|
|
|
370
370
|
Rejection tags and what each costs a worker's reputation: `dollarplatoon.com/skill/proofs.md`.
|
|
371
371
|
|
|
372
|
+
**A pending proof can vanish from the list — that is a withdrawal, not a bug.** A worker may pull their own `pending` submission back to a private draft (`POST .../proofs/:proof_id/withdraw`), usually to fix a bad link or a missing master, and re-send it later with a fresh review window and `"resubmitted": true` on the webhook. Key your automation off the proof id so a re-send is not reviewed twice. Drafts are filtered out of your list entirely, and the moment you approve or reject, withdrawal is closed to them — your verdict is final from their side.
|
|
373
|
+
|
|
374
|
+
**The card will not play? Check the link before you judge the work.** `vidfarm gigs verify-proof --proof "<the url on the proof>"` fetches it with no key and no cookie — the way the deck does — and names the reason: a 403 bucket, a 404, an error page served as `video/mp4`, an expiring presigned url, or a link behind a login. Reject that `incomplete` with the reason, not `low_quality`: the video is often fine and only the upload is broken, and the worker fixes it in a minute. Do not just leave it — silence is approval, so an unplayable proof you ignore is one you pay for. A **watermark** on a proof is not a defect: the clipper is told to publish the watermarked cut and seal the clean master in `private_note`, which unseals on `paid_out_at`.
|
|
375
|
+
|
|
372
376
|
**3 — Release the payouts.** **Approved is not paid.** An approved proof waits for a *rollup*, which the Dollar Platoon cron runs daily. Run it now with `POST .../payouts`, or read what it would cost first with `GET .../payouts`. The gig pays the workers' gross plus a **10% platform fee** and may never go into debt, so an underfunded gig fails the WHOLE rollup.
|
|
373
377
|
|
|
374
378
|
```bash
|
|
@@ -7,6 +7,31 @@ Almost every editor session is a director taking a template / fork / project and
|
|
|
7
7
|
|
|
8
8
|
Name the plan back in these terms ("I'll SWAP the captions and REPLACE the scenes"), then execute axis by axis. Be **proactive at the heavy end** — carry the whole transformation, don't wait to be micro-managed one layer at a time.
|
|
9
9
|
|
|
10
|
+
### Before the axes: audit every element, one at a time
|
|
11
|
+
|
|
12
|
+
**A fork of a decomposed template is not a half-finished video — it is somebody else's FINISHED one.** Every element in it was chosen for their product, their customer, their face, their joke. An element nobody re-decides stays theirs, and the director's audience watches it. The axes above tell you what *kind* of re-work this is; the audit tells you *which specific elements* it touches, and it is what turns "re-theme" into relevant customization instead of a caption swap.
|
|
13
|
+
|
|
14
|
+
So the moment you pull a fork, list its elements and give each one a verdict — **KEEP**, **REPLACE** or **CUT** — into `./work/ADAPTATION.md` (one row per element: key, what it is, verdict, why, what replaced it).
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
vidfarm pull <forkId> --dir ./work --json | jq -r '.layers[] | [.key,(.kind//"?"),(.start|tostring),(.src//"—")] | @tsv'
|
|
18
|
+
grep -o 'data-src="[^"]*"' ./work/composition.html | sort -u # every asset the video still loads
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**KEEP is the verdict that needs a reason; REPLACE is the default.** An element you overlooked and an element you deliberately kept produce byte-identical HTML, so the written ledger is the only thing that separates them, and no automated check will ever flag the first one.
|
|
22
|
+
|
|
23
|
+
| Stays — this is DNA | Goes — this is content |
|
|
24
|
+
|---|---|
|
|
25
|
+
| beat count and beat order; any beat the harness marks critical / `must_keep` | voiceover, every line — a fork ships the source brand's narration, and it passes every automated check |
|
|
26
|
+
| each layer's `start`, `duration`, track and transitions — the rhythm | the music bed and the SFX |
|
|
27
|
+
| the caption identity: font, size, placement, background style | every caption word |
|
|
28
|
+
| the hook's *shape* and the payoff's *position* | on-screen text that is not a caption — titles, kickers, labels, prices, stat callouts, end cards |
|
|
29
|
+
| the grade, the vignette, the stage treatment behind a background | the picture inside that background |
|
|
30
|
+
| the palette and type tokens, unless the director has a brand | actor / talking-head clips (a face is a brand), product shots, screenshots, UI frames, mockups |
|
|
31
|
+
| generic b-roll that is still true in the new subject's world — "a keyboard" survives a subject change, "a barista" does not survive a move to fintech | stickers and icons that name a thing; every logo, wordmark, @handle, URL and watermark — **those are never a KEEP** |
|
|
32
|
+
|
|
33
|
+
Three tie-breaks when a row is not obvious: **provenance** (did I put this file here, or did I inherit it?), **relevance** (does it show the DIRECTOR's world?), **load-bearing** (cut it — does the beat still work? then CUT wins). Run the audit **before** sourcing: every REPLACE row is a line on the procurement list, which is what stops a beat being built twice. Report the counts — kept / replaced / cut — with the render. The full version is §3½ of `https://vidfarm.cc/flash-harness.md`.
|
|
34
|
+
|
|
10
35
|
**Fuel a scene REPLACE with raw clips, not expensive AI video.** A heavy scenes-axis replace needs footage; sources in cost order: (1) the director's own library — search `/raws` and `/files` (`vidfarm raws search …`, `vidfarm files --search …` / `browse_files`); (1b) the **PUBLIC RAWS catalog, browsed by category** — free, pre-tagged, already on the platform, and no download or hunt required (`vidfarm public-raws --categories` to see the shelves, then `--category <shelf>`); (2) **HUNT new raws** out of a long-form source (podcast/VOD/webinar or any YouTube/TikTok/IG/X URL) — `vidfarm raws scan <src> --prompt "<what the new scenes need>" --aspect <canvas> [--duration N --no-text --range …]` (local-first, free compute) or the async `POST /clips/scan` / `/raws/scan`; then reuse the picks (`set_layer_media` / `vidfarm set-media` to swap in place, `add_layer`/`vidfarm place` for net-new scenes); (3) `generate_layer` / `vidfarm generate` AI generation — the **expensive last resort**, only for scenes no real clip can cover. When a big scene re-work is asked for but no footage is given, **ask for a source to hunt (or point at the raws library) before AI-generating** — see [Raws](#raws-long-form--short-form-raws) and [Generate AI media …](#generate-ai-media-and-drop-it-on-the-timeline).
|
|
11
36
|
|
|
12
37
|
**Audio is natively multi-track — overlay narration + music + SFX, each at its own volume.** A composition mixes UNLIMITED simultaneous `<audio>` layers; each sits on its own `data-track-index` and carries its own `data-volume` (0–2, default 1), and the runtime mixes them with per-track volume honored identically in the preview and the exported MP4 (a real ffmpeg `amix` of every audio layer at render). So you never need a pre-mixed file — lay **narration/voiceover at ~1.0 on one track, a music bed at ~0.1–0.2 on a separate track, and SFX on their own tracks**, each via `add_layer kind=audio` (web) / `vidfarm place --kind audio --volume …` (devcli), tuning levels later with the Inspector's Volume slider or `set_layer_media` (`volume`, `muted`). **The key move when recreating a template whose original baked music + narration into ONE audio track: rebuild it as TWO independent tracks** — a fresh narration track (`/audio/speech`, or same-voice reword via `/audio/regenerate-speech` / `vidfarm speech regenerate`) at ~1.0 and a separate real music track at ~0.1–0.2 — then mute/remove the original combined source-audio layer. This gives the director independent voice and music volume, and works around AI TTS being unable to emit narration+music in one file: you compose the mix on the timeline. Honesty: you can't un-mix / stem-separate the original's baked audio — the two tracks are a fresh narration track **plus** a real music file (owned / user-provided / `browse_files` / generated with `/api/v1/primitives/music/generate` (`vidfarm music`)), never a faked or duplicated voice layer.
|
package/SKILL.director.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: vidfarm
|
|
3
|
-
skill_version: 0.21.
|
|
3
|
+
skill_version: 0.21.59
|
|
4
4
|
description: Use Vidfarm as a director. Run a strategy **consultation** (the `brainstorm/*` chain — cold-start interview, awareness stages, persuasive angles, hooks, product placement). Answer "give me content ideas" / "what should I post" / "I need 30 videos this month" from the bundled idea banks (50 content frames x 5 awareness stages x 44 problem angles). Browse/add inspiration videos, browse the free public raws catalog BY CATEGORY (curated shelves like scroll-stoppers/greenscreen/reaction — the cheapest way to source footage for one video, and a ready-made clip pool for bulk scripting N variants), fork a template into a composition, edit it in the Trackpad Editor (timeline-based like Premiere/DaVinci), auto-decompose source video into scenes, render to MP4, approve into a shareable post, and schedule it. Includes login, provider keys, discovery, versioning, uploads/downloads, and billing. Every step is available as raw REST; `vidfarm-devcli` wraps those routes and composes the file-backed scripting flows.
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -572,7 +572,7 @@ The File Index above says what each file *is*; this says which one a given ask m
|
|
|
572
572
|
5b. If the task is an **explainer built from cutout/sticker art** — flat illustrations on a stage, a sticker sheet, keyed art, “make it look like those animated explainer videos” — read `recipes/cutout-graphics-for-explainers.md`. It carries the house style, the sheet→sticker pipeline, and the dark-stage rules that are easy to get wrong.
|
|
573
573
|
5c. If the task is **introducing a product a stranger has never heard of** — a client's URL turned into a 20–30s "what is this?" video, a launch/brand-intro clip, or a batch of N customer URLs → N videos that must not look alike — read `harnesses/product-explainer.HARNESS.md`. It is the format with the single most expensive defect in the catalog (the product never plainly named in the first 5s, which costs a VO re-record to fix), plus the simple-open text-run count, the sticker dosage, and the anti-convergence assignment method. Use `product-demo` instead when you actually have the UI on screen.
|
|
574
574
|
6. If the task explicitly asks for a primitive or needs specialized generation/transcription work, read `references/primitives.md`.
|
|
575
|
-
7. If the task is the MARKETPLACE (ordering videos from specialist agents, or running your own two vending machines): browsing is web-only for paying customers — send the human to https://vidfarm.cc/marketplace, never render it locally. **`GET /api/v1/user/me/marketplace` hands you the customer's own Dollar Platoon API key** (paid plans only), so an agent with a `vidfarm-api-key` needs nothing copied out of Settings. Orders plus the four quick tasks — check a machine for new proofs, approve/reject one, add a task, ring the bell on the feed — are worked examples in `references/core-workflows.md` (§ Marketplace, § Your Dollar Platoon key). **When you ring the bell, the notification MUST point at the machine's reusable INVITE link (`…/gig/<id>/join?invite=<token>`)** — that is what a gigworker taps to join and pitch. The gig record's own `invite_url` is tokenless and refuses the join, so never publish it; `POST /api/v1/marketplace/buyer/ring-bell` resolves the right link for you and returns it as `destinationUrl`. Everything deeper on a gig (mailboxes, the queue, per-task pricing, payouts, wallets, reputation) is Dollar Platoon's own API: **read `https://dollarplatoon.com/skill.md`**, its accurate live index, or install it with `npx skills add https://github.com/OfficeXApp/dollarplatoon-skill` — the same way FlockPoster work beyond scheduling needs `npx skills add https://github.com/OfficeXApp/flockposter-skill`. Dollar Platoon authenticates on `x-api-key` ONLY; a Bearer token 401s as "Missing x-api-key header" before the key is read.
|
|
575
|
+
7. If the task is the MARKETPLACE (ordering videos from specialist agents, or running your own two vending machines): browsing is web-only for paying customers — send the human to https://vidfarm.cc/marketplace, never render it locally. **`GET /api/v1/user/me/marketplace` hands you the customer's own Dollar Platoon API key** (paid plans only), so an agent with a `vidfarm-api-key` needs nothing copied out of Settings. Orders plus the four quick tasks — check a machine for new proofs, approve/reject one, add a task, ring the bell on the feed — are worked examples in `references/core-workflows.md` (§ Marketplace, § Your Dollar Platoon key). **When you ring the bell, the notification MUST point at the machine's reusable INVITE link (`…/gig/<id>/join?invite=<token>`)** — that is what a gigworker taps to join and pitch. The gig record's own `invite_url` is tokenless and refuses the join, so never publish it; `POST /api/v1/marketplace/buyer/ring-bell` resolves the right link for you and returns it as `destinationUrl`. Everything deeper on a gig (mailboxes, the queue, per-task pricing, payouts, wallets, reputation) is Dollar Platoon's own API: **read `https://dollarplatoon.com/skill.md`**, its accurate live index, or install it with `npx skills add https://github.com/OfficeXApp/dollarplatoon-skill` — the same way FlockPoster work beyond scheduling needs `npx skills add https://github.com/OfficeXApp/flockposter-skill`. Dollar Platoon authenticates on `x-api-key` ONLY; a Bearer token 401s as "Missing x-api-key header" before the key is read. **On the earning side, never submit a proof without the sanity check first:** `vidfarm gigs verify-proof --proof <url> --clean-master ./final-clean.mp4` needs no key, loads every proof url the way a stranger's browser would, and exits non-zero on a dead link, a 403 bucket, an error page served as `video/mp4`, or an **expiring presigned url** — then checks the watermarked cut is the public half and the clean master the sealed one. `vidfarm gigs submit` runs it too and refuses a failing proof. **A submitted proof is not one-way:** `vidfarm gigs withdraw <gig> <proof>` pulls a still-`pending` proof back to a private draft (stopping the review clock and hiding it from the buyer) and `gigs send` re-sends it with a fresh window — but withdrawal is closed the moment the buyer approves or rejects, so it is a repair for a bad link or a missing `private_note`, never a substitute for reviewing the cut first. `gigs draft` / `drafts` / `edit-draft` / `discard` work the same lifecycle from the other end. The whole earning loop is `https://vidfarm.cc/agentic-clipper.md`.
|
|
576
576
|
|
|
577
577
|
## Non-Negotiables
|
|
578
578
|
|
|
@@ -967,6 +967,10 @@ curl -s -X PATCH -H "x-api-key: $DP" -H "content-type: application/json" \
|
|
|
967
967
|
|
|
968
968
|
Rejection tags and what each costs a worker's reputation: `dollarplatoon.com/skill/proofs.md`.
|
|
969
969
|
|
|
970
|
+
**A pending proof can vanish from the list — that is a withdrawal, not a bug.** A worker may pull their own `pending` submission back to a private draft (`POST .../proofs/:proof_id/withdraw`), usually to fix a bad link or a missing master, and re-send it later with a fresh review window and `"resubmitted": true` on the webhook. Key your automation off the proof id so a re-send is not reviewed twice. Drafts are filtered out of your list entirely, and the moment you approve or reject, withdrawal is closed to them — your verdict is final from their side.
|
|
971
|
+
|
|
972
|
+
**The card will not play? Check the link before you judge the work.** `vidfarm gigs verify-proof --proof "<the url on the proof>"` fetches it with no key and no cookie — the way the deck does — and names the reason: a 403 bucket, a 404, an error page served as `video/mp4`, an expiring presigned url, or a link behind a login. Reject that `incomplete` with the reason, not `low_quality`: the video is often fine and only the upload is broken, and the worker fixes it in a minute. Do not just leave it — silence is approval, so an unplayable proof you ignore is one you pay for. A **watermark** on a proof is not a defect: the clipper is told to publish the watermarked cut and seal the clean master in `private_note`, which unseals on `paid_out_at`.
|
|
973
|
+
|
|
970
974
|
**3 — Release the payouts.** **Approved is not paid.** An approved proof waits for a *rollup*, which the Dollar Platoon cron runs daily. Run it now with `POST .../payouts`, or read what it would cost first with `GET .../payouts`. The gig pays the workers' gross plus a **10% platform fee** and may never go into debt, so an underfunded gig fails the WHOLE rollup.
|
|
971
975
|
|
|
972
976
|
```bash
|
|
@@ -1144,6 +1148,31 @@ Almost every editor session is a director taking a template / fork / project and
|
|
|
1144
1148
|
|
|
1145
1149
|
Name the plan back in these terms ("I'll SWAP the captions and REPLACE the scenes"), then execute axis by axis. Be **proactive at the heavy end** — carry the whole transformation, don't wait to be micro-managed one layer at a time.
|
|
1146
1150
|
|
|
1151
|
+
### Before the axes: audit every element, one at a time
|
|
1152
|
+
|
|
1153
|
+
**A fork of a decomposed template is not a half-finished video — it is somebody else's FINISHED one.** Every element in it was chosen for their product, their customer, their face, their joke. An element nobody re-decides stays theirs, and the director's audience watches it. The axes above tell you what *kind* of re-work this is; the audit tells you *which specific elements* it touches, and it is what turns "re-theme" into relevant customization instead of a caption swap.
|
|
1154
|
+
|
|
1155
|
+
So the moment you pull a fork, list its elements and give each one a verdict — **KEEP**, **REPLACE** or **CUT** — into `./work/ADAPTATION.md` (one row per element: key, what it is, verdict, why, what replaced it).
|
|
1156
|
+
|
|
1157
|
+
```bash
|
|
1158
|
+
vidfarm pull <forkId> --dir ./work --json | jq -r '.layers[] | [.key,(.kind//"?"),(.start|tostring),(.src//"—")] | @tsv'
|
|
1159
|
+
grep -o 'data-src="[^"]*"' ./work/composition.html | sort -u # every asset the video still loads
|
|
1160
|
+
```
|
|
1161
|
+
|
|
1162
|
+
**KEEP is the verdict that needs a reason; REPLACE is the default.** An element you overlooked and an element you deliberately kept produce byte-identical HTML, so the written ledger is the only thing that separates them, and no automated check will ever flag the first one.
|
|
1163
|
+
|
|
1164
|
+
| Stays — this is DNA | Goes — this is content |
|
|
1165
|
+
|---|---|
|
|
1166
|
+
| beat count and beat order; any beat the harness marks critical / `must_keep` | voiceover, every line — a fork ships the source brand's narration, and it passes every automated check |
|
|
1167
|
+
| each layer's `start`, `duration`, track and transitions — the rhythm | the music bed and the SFX |
|
|
1168
|
+
| the caption identity: font, size, placement, background style | every caption word |
|
|
1169
|
+
| the hook's *shape* and the payoff's *position* | on-screen text that is not a caption — titles, kickers, labels, prices, stat callouts, end cards |
|
|
1170
|
+
| the grade, the vignette, the stage treatment behind a background | the picture inside that background |
|
|
1171
|
+
| the palette and type tokens, unless the director has a brand | actor / talking-head clips (a face is a brand), product shots, screenshots, UI frames, mockups |
|
|
1172
|
+
| generic b-roll that is still true in the new subject's world — "a keyboard" survives a subject change, "a barista" does not survive a move to fintech | stickers and icons that name a thing; every logo, wordmark, @handle, URL and watermark — **those are never a KEEP** |
|
|
1173
|
+
|
|
1174
|
+
Three tie-breaks when a row is not obvious: **provenance** (did I put this file here, or did I inherit it?), **relevance** (does it show the DIRECTOR's world?), **load-bearing** (cut it — does the beat still work? then CUT wins). Run the audit **before** sourcing: every REPLACE row is a line on the procurement list, which is what stops a beat being built twice. Report the counts — kept / replaced / cut — with the render. The full version is §3½ of `https://vidfarm.cc/flash-harness.md`.
|
|
1175
|
+
|
|
1147
1176
|
**Fuel a scene REPLACE with raw clips, not expensive AI video.** A heavy scenes-axis replace needs footage; sources in cost order: (1) the director's own library — search `/raws` and `/files` (`vidfarm raws search …`, `vidfarm files --search …` / `browse_files`); (1b) the **PUBLIC RAWS catalog, browsed by category** — free, pre-tagged, already on the platform, and no download or hunt required (`vidfarm public-raws --categories` to see the shelves, then `--category <shelf>`); (2) **HUNT new raws** out of a long-form source (podcast/VOD/webinar or any YouTube/TikTok/IG/X URL) — `vidfarm raws scan <src> --prompt "<what the new scenes need>" --aspect <canvas> [--duration N --no-text --range …]` (local-first, free compute) or the async `POST /clips/scan` / `/raws/scan`; then reuse the picks (`set_layer_media` / `vidfarm set-media` to swap in place, `add_layer`/`vidfarm place` for net-new scenes); (3) `generate_layer` / `vidfarm generate` AI generation — the **expensive last resort**, only for scenes no real clip can cover. When a big scene re-work is asked for but no footage is given, **ask for a source to hunt (or point at the raws library) before AI-generating** — see [Raws](#raws-long-form--short-form-raws) and [Generate AI media …](#generate-ai-media-and-drop-it-on-the-timeline).
|
|
1148
1177
|
|
|
1149
1178
|
**Audio is natively multi-track — overlay narration + music + SFX, each at its own volume.** A composition mixes UNLIMITED simultaneous `<audio>` layers; each sits on its own `data-track-index` and carries its own `data-volume` (0–2, default 1), and the runtime mixes them with per-track volume honored identically in the preview and the exported MP4 (a real ffmpeg `amix` of every audio layer at render). So you never need a pre-mixed file — lay **narration/voiceover at ~1.0 on one track, a music bed at ~0.1–0.2 on a separate track, and SFX on their own tracks**, each via `add_layer kind=audio` (web) / `vidfarm place --kind audio --volume …` (devcli), tuning levels later with the Inspector's Volume slider or `set_layer_media` (`volume`, `muted`). **The key move when recreating a template whose original baked music + narration into ONE audio track: rebuild it as TWO independent tracks** — a fresh narration track (`/audio/speech`, or same-voice reword via `/audio/regenerate-speech` / `vidfarm speech regenerate`) at ~1.0 and a separate real music track at ~0.1–0.2 — then mute/remove the original combined source-audio layer. This gives the director independent voice and music volume, and works around AI TTS being unable to emit narration+music in one file: you compose the mix on the timeline. Honesty: you can't un-mix / stem-separate the original's baked audio — the two tracks are a fresh narration track **plus** a real music file (owned / user-provided / `browse_files` / generated with `/api/v1/primitives/music/generate` (`vidfarm music`)), never a faked or duplicated voice layer.
|
|
@@ -4633,16 +4662,17 @@ Use this when the user wants to keep the format’s feel but replace the subject
|
|
|
4633
4662
|
1. Read `references/editor-workflows.md`.
|
|
4634
4663
|
2. Fetch `video-context.json` and `editor-harness.json` first.
|
|
4635
4664
|
3. State the plan in the three axes vocabulary: scenes, audio, text; SWAP vs REPLACE for each.
|
|
4636
|
-
4.
|
|
4637
|
-
5.
|
|
4665
|
+
4. **Audit every element before you touch one.** The fork is somebody else's *finished* video, so list its layers (`vidfarm pull <forkId> --json` → `.layers[]`, plus `grep -o 'data-src="[^"]*"' composition.html | sort -u`) and write one row per element into `./work/ADAPTATION.md`: KEEP / REPLACE / CUT, why, what replaced it. **KEEP is the verdict that needs a reason.** Structure stays (beat count and order, `start`/`duration`, cut rhythm, transitions, caption identity); meaning goes (voiceover, music, caption words, on-screen titles and prices and stats, actor clips, product shots and screenshots, stickers that name a thing, the picture behind a background, and every logo, @handle, URL and watermark). See `references/editor-workflows.md` → *Before the axes: audit every element*. The REPLACE rows are your sourcing list for step 6.
|
|
4666
|
+
5. Preserve the hook structure, cut rhythm, emotional punch, and important scenes flagged by the harness. **Read `references/hooks-and-virality.md` before rewriting the opening line or the retention beat** — `viral_dna.hook`/`retention`/`payoff` name the source's four charges, and rebuilding each one for the new subject (rather than flattening the loop into a product statement) is the whole job.
|
|
4667
|
+
6. Source footage for every REPLACE row, in this order:
|
|
4638
4668
|
- My Files or existing raws
|
|
4639
4669
|
- a raws hunt from a long-form source
|
|
4640
4670
|
- AI image generation
|
|
4641
4671
|
- AI video generation only with permission
|
|
4642
|
-
|
|
4643
|
-
|
|
4672
|
+
7. Rebuild captions and narration so timing, cadence, and joke structure survive the subject change.
|
|
4673
|
+
8. Render, verify, then approve and schedule only after the director is happy. Report the audit counts — kept / replaced / cut — with it.
|
|
4644
4674
|
|
|
4645
|
-
|
|
4675
|
+
Two failure modes to avoid: flattening the format by swapping words but losing the timing, sound, or payoff beat — and the opposite, swapping the words and leaving everything else, so the source brand's voice, screenshots, stickers or handle ship inside the director's video.
|
|
4646
4676
|
|
|
4647
4677
|
## Recipe: Local Pull, Edit, Render, Approve
|
|
4648
4678
|
|
package/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: vidfarm
|
|
3
|
-
skill_version: 0.21.
|
|
3
|
+
skill_version: 0.21.59
|
|
4
4
|
description: Entry point for making, editing, and rendering short-form video with Vidfarm. Use when the task is to create a video, ad, explainer, or social clip; to edit or re-theme an existing composition; to source footage or audio; or to run a batch of video variants. Routes to the full director skill and the `vidfarm` CLI.
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -123,6 +123,8 @@ A capable agent can replicate a template entirely on brush 1 and 2, on the free
|
|
|
123
123
|
|
|
124
124
|
**There is a fourth source, and for a weak model it is the FIRST one: a template somebody already decomposed.** `/discover` holds thousands of viral videos that have been taken apart into their scene-by-scene DNA — hook, retention, payoff, cut rhythm, typography, per-beat paintbrush assignments — and forking one is free. That decomposition costs $1+ in AI spend to reproduce yourself, so always check for an existing one before paying to re-run it. `vidfarm discover --query "<the client's problem, in their words>" --json`; a row carrying `summary`, `keywords` and `promotions` is decomposed. **Weak models: this is not an optimisation, it is the method** — see `vidfarm.cc/flash-harness.md`.
|
|
125
125
|
|
|
126
|
+
**A fork is not a half-finished video. It is somebody else's finished one.** Every element in it was chosen for their product, their customer, their face. So the moment you fork, audit the composition element by element and give each one a verdict — KEEP, REPLACE or CUT — before you plan or source anything. See the standard in §6.
|
|
127
|
+
|
|
126
128
|
## 3. Worked example — one video, end to end
|
|
127
129
|
|
|
128
130
|
```bash
|
|
@@ -215,6 +217,7 @@ Say the phase out loud when you switch. Deciding to source mid-build is how a $0
|
|
|
215
217
|
|
|
216
218
|
The standards themselves are not optional. `vidfarm qa <dir>` is — it is a free local checker for most of them, feedback rather than a gate. Nothing calls it, skipping it is fine, and it allows one fix round by default. **Watching the render is the review that counts.** Full reasoning: `references/hooks-and-virality.md` and `references/reviewing-renders.md`.
|
|
217
219
|
|
|
220
|
+
- **Forked a decomposed template? Audit every element, and KEEP is the verdict that needs a reason.** List the layers (`vidfarm pull <forkId> --json` → `.layers[]`, plus `grep -o 'data-src="[^"]*"' composition.html | sort -u`) and write `./work/ADAPTATION.md`: one row per element, verdict KEEP / REPLACE / CUT, why, and what replaced it. **Structure is DNA and stays** — beat count and order, `start`/`duration`, cut rhythm, transitions, caption identity (font, size, placement, background). **Meaning is content and goes** — voiceover, music, caption words, on-screen titles and stats and prices, actor and talking-head clips, product shots and screenshots, stickers that name a thing, the picture behind a background, and every logo, wordmark, @handle, URL and watermark (those are never a KEEP). Generic b-roll may stay when it is still true in the client's world. Run the audit **before** sourcing — every REPLACE row is a line on the procurement list — and report the counts: kept / replaced / cut. Swapping the captions and nothing else is the most common rejected video there is. Full table: `vidfarm.cc/flash-harness.md` §3½.
|
|
218
221
|
- **Write the four charges before the timeline.** Hook: first line is a complete clause naming a situation, on screen at `start:0`. Loop: one open question by 0:10, closing inside this video. Payoff: shown, not summarized. Bait: one ask, final beat. Banned openers — throat-clearing, a logo, a title card, a fade from black.
|
|
219
222
|
- **No HTML slop.** Test: could you have made this element inside TikTok's own editor? If you reached past that — a padded capsule, border, gradient fill, blur panel, card, CTA "button", benefit chips, feature grid — cut it. Nothing in a video is clickable. Emphasize with size, weight, caps, an accent colour, or a drawn mark.
|
|
220
223
|
- **No layout templates — judge the whole frame.** The stack is the tell, not the box: headline + subheadline + CTA centred in a well is a landing page even with every border, fill and capsule stripped off. Banned at frame level — a modal/dialog floating over a dimmed or blurred backdrop, a full-frame wash used to stage a floating block, nav/hero/feature-row sections, a blurred website screenshot as the background plate, document margins. Unstack it into time: hook at t=0, support line on the next cut, CTA spoken or a bare caption. Are you arranging words relative to each other, or relative to the picture? Two text runs at once is the ceiling.
|
|
@@ -271,6 +274,8 @@ Also served at `vidfarm.cc`: `/flash-harness.md` (**the weak-model process harne
|
|
|
271
274
|
|
|
272
275
|
**The two marketplace harnesses never mix.** A buyer's agent must never load the clipper loop and a clipper must never load the buyer loop. If the user's side is unclear, ask: *"Do you want videos made for you, or do you want to get paid to make videos for other people?"*
|
|
273
276
|
|
|
274
|
-
**But an ask about EARNING has already answered it — do not ask.** *"help me earn on vidfarm marketplace"*, *"help me make money on vidfarm"*, *"find me video gigs"*, *"any work today?"*, *"check the vending machines"*, *"run in agentic clipper mode"* all mean the **clipper** side: load `/agentic-clipper.md`, then run the four moves — read the feed's recent notifications for who is asking right now, pull the `GIG_…` id out of each notification's join link and check `available_funds` before committing, join the funded ones with a Base L2 `wallet_address` in the same call, then `GET /work/available` and poll a queue for a task. The copy-paste version is in `/marketplace.md` → *"help me earn on vidfarm" — the whole first session*.
|
|
277
|
+
**But an ask about EARNING has already answered it — do not ask.** *"help me earn on vidfarm marketplace"*, *"help me make money on vidfarm"*, *"find me video gigs"*, *"any work today?"*, *"check the vending machines"*, *"run in agentic clipper mode"* all mean the **clipper** side: load `/agentic-clipper.md`, then run the four moves — read the feed's recent notifications for who is asking right now, pull the `GIG_…` id out of each notification's join link and check `available_funds` before committing, join the funded ones with a Base L2 `wallet_address` in the same call, then `GET /work/available` and poll a queue for a task. The copy-paste version is in `/marketplace.md` → *"help me earn on vidfarm" — the whole first session*. **Those four moves are the first session; a loop that runs for weeks is paced.** `GET /work/available` is the MAP (one call, every machine) and `POST /gigs/:id/queue/poll` is the CLAIM (per machine) — so walk only the machines the map lit up, one at a time, until your build slots (`max_subagents`) are full, stop there, and resume the walk from that machine when a slot opens. **Never re-poll a machine inside 12 hours** unless a new bell rang for it, the map says it holds work, a proof of yours there was approved or paid, or the gigworker asks; **sweep the notifications twice a day**, not every cycle, and join the funded machines it turns up. A task you cannot deliver is **declined** (`POST /gigs/:id/queue/:msgId/decline` — free, per-worker, and without it the same task heads your FIFO forever), never held and never substituted; a task that names no format is where the clipper's own specialty goes. Full apparatus: `/agentic-clipper.md` § 3⅞ and § 4 ①–②.
|
|
275
278
|
|
|
276
279
|
**Then ask the gigworker one more question: the RUN MODE.** It decides which stages of every task stop for them — `full-interactive` (shortlist · plan · raws · cut), `quick-interactive` (shortlist · cut), `auto-batch` (cut only — build the batch unattended, review it in one sitting), `auto-submit` (nothing; opt-in, in their own words). The middle two are the common ones. `vidfarm clipper-run mode` explains all four and saves the answer, `vidfarm clipper-run next` says what to do right now, and `vidfarm clipper-run gate <task>` exits non-zero while a human gate is open — so `gate && gigs submit …` cannot send an unreviewed cut. Full section: `/marketplace.md` → *The four run modes*.
|
|
280
|
+
|
|
281
|
+
**Before ANY proof is submitted, run the sanity check — every time, on every side of the loop.** `vidfarm gigs verify-proof --proof <url> --clean-master ./final-clean.mp4` needs no api key. It loads each proof url the way a stranger's browser would (no key, no cookie) and exits non-zero on a 403 bucket, a 404, an s3 AccessDenied body served as `video/mp4`, an **expiring presigned url** (read access dies before the buyer swipes), a `localhost`/Drive/Dropbox link, or a 0-byte file. It then checks the delivery is split the right way: the **watermarked** cut public in `proofs[]`, the **clean master** sealed in `private_note` (`--clean-master`) — recommended, not required, so putting the unwatermarked final in the proof itself only warns, and `--clean-in-proof` says you meant it. `vidfarm gigs submit` runs the same check and refuses a failing proof. The two gates are different questions: `clipper-run gate` = *did a human watch it*, `gigs verify-proof` = *can the buyer open it*. Full section: `/marketplace.md` → *the sanity check before you send*.
|
package/dist/src/cli.js
CHANGED
|
@@ -1195,7 +1195,7 @@ Marketplace (paid, cloud-only — the bazaar never renders locally):
|
|
|
1195
1195
|
gigs <sub> Your vending machines, BOTH sides (client + gigworker)
|
|
1196
1196
|
machines · tasks · add-task · proofs · approve · reject · ring-bell (client, paid)
|
|
1197
1197
|
earn · feed · check · join · work · claim · submit · proof · earnings (gigworker, free — bring DOLLARPLATOON_API_KEY)
|
|
1198
|
-
upload · mine · join-feed
|
|
1198
|
+
upload · verify-proof · mine · join-feed
|
|
1199
1199
|
"HELP ME EARN ON VIDFARM" IS ONE COMMAND: vidfarm gigs earn. It joins the
|
|
1200
1200
|
feed, reads who is asking for videos right now, checks every one of those
|
|
1201
1201
|
machines for MONEY, and ranks them best-payer-first with the join command.
|
|
@@ -1203,7 +1203,13 @@ Marketplace (paid, cloud-only — the bazaar never renders locally):
|
|
|
1203
1203
|
spend an hour, because approval does not create money. 'gigs submit
|
|
1204
1204
|
--clean-master <file>' seals the unwatermarked cut in the proof's private
|
|
1205
1205
|
note, which the buyer cannot open until a rollup has actually paid you.
|
|
1206
|
+
'gigs verify-proof --proof <url>' is the PRE-SUBMIT sanity check and needs no
|
|
1207
|
+
key: it loads every url the way a stranger's browser would and refuses a dead
|
|
1208
|
+
link, a 403 bucket or an expiring presigned url, then checks the watermarked
|
|
1209
|
+
cut and the clean master are not the wrong way round. 'gigs submit' runs it
|
|
1210
|
+
for you and will not send a broken proof.
|
|
1206
1211
|
e.g. vidfarm gigs earn
|
|
1212
|
+
vidfarm gigs verify-proof --proof https://…/final-watermarked.mp4 --clean-master ./final-clean.mp4
|
|
1207
1213
|
vidfarm gigs add-task --task "60s explainer for acme.com" --price 0.50 --upload-link <share url>
|
|
1208
1214
|
vidfarm gigs proofs --status pending · vidfarm gigs approve PRF_01H…
|
|
1209
1215
|
(see: vidfarm gigs help · the loop: vidfarm.cc/agentic-clipper.md)
|
|
@@ -350,6 +350,10 @@ function cmdInit(root, values) {
|
|
|
350
350
|
seed("NOTES.md", "# Notes\n\nWhat each buyer approved, what they rejected and with which tag, prices that moved.\n");
|
|
351
351
|
seed("EARNINGS.md", "# Earnings\n\nsubmitted / approved / PAID / owed, with dates. `approved` is not `paid`.\n");
|
|
352
352
|
seed("LEDGER.jsonl", "");
|
|
353
|
+
// The anti-repeat record. LEDGER.jsonl knows the money; this knows the IDEA —
|
|
354
|
+
// which clip, which hook, which pain went to which buyer. Read it before you
|
|
355
|
+
// shortlist, or you sell one buyer the same video twice.
|
|
356
|
+
seed("DELIVERED.tsv", "# gig_id\tproof_id\tharness\ttemplate_id\tsource_clip\thook\tpain\tverdict\n");
|
|
353
357
|
writeReviewQueue(root);
|
|
354
358
|
out(Boolean(values.json), { ok: true, root, mode, created }, () => {
|
|
355
359
|
console.log(`${GREEN}✓${RESET} Mission folder ready at ${BOLD}${root}${RESET}`);
|
|
@@ -806,6 +810,10 @@ function cmdGate(root, values, positionals) {
|
|
|
806
810
|
}, () => {
|
|
807
811
|
if (!blocked) {
|
|
808
812
|
console.log(`${GREEN}✓ CLEARED TO SUBMIT${RESET} ${BOLD}${state.task_id}${RESET}${state.reviewed_by_gigworker ? ` ${DIM}(gigworker approved the cut at ${state.reviewed_by_gigworker})${RESET}` : ` ${DIM}(auto-submit — no human watched this)${RESET}`}`);
|
|
813
|
+
// This gate answers "did a human watch it", never "can the buyer open it".
|
|
814
|
+
// The second question is the other pre-submit check, and it is the one that
|
|
815
|
+
// catches a 403 bucket or an expiring link.
|
|
816
|
+
console.log(` ${DIM}Now check the buyer can actually play it: vidfarm gigs verify-proof --proof <url>${state.clean_master ? ` --clean-master ${state.clean_master}` : ""}${RESET}`);
|
|
809
817
|
return;
|
|
810
818
|
}
|
|
811
819
|
console.log(`${YELLOW}HOLD${RESET} ${BOLD}${state.task_id}${RESET} ${DIM}is at ${state.stage}${state.gate ? ` and waiting on the gigworker (${state.gate.stage})` : ""}${RESET}`);
|