@officexapp/vidfarm-devcli 0.21.45 → 0.21.46
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 +2 -0
- package/.agents/skills/vidfarm/SKILL.md +60 -7
- package/.agents/skills/vidfarm/harnesses/explainer.HARNESS.md +1 -1
- package/.agents/skills/vidfarm/harnesses/product-demo.HARNESS.md +2 -0
- package/.agents/skills/vidfarm/harnesses/short-form.HARNESS.md +1 -0
- package/.agents/skills/vidfarm/recipes/local-edit-render-approve.md +1 -1
- package/.agents/skills/vidfarm/references/agent-included-imagegen.md +75 -0
- package/.agents/skills/vidfarm/references/assets-and-sourcing.md +56 -2
- package/.agents/skills/vidfarm/references/automation-and-local-dev.md +13 -6
- package/.agents/skills/vidfarm/references/browser-harness.md +93 -0
- package/.agents/skills/vidfarm/references/editor-workflows.md +22 -0
- package/SKILL.director.md +322 -16
- package/SKILL.md +44 -3
- package/crowdsourcing.md +373 -2
- package/dist/src/cli.js +207 -4
- package/dist/src/devcli/agent-imagegen.js +181 -0
- package/dist/src/devcli/browser-harness.js +384 -0
- package/dist/src/devcli/clip-store.js +41 -3
- package/dist/src/devcli/cost-mode.js +23 -3
- package/dist/src/devcli/doctor.js +52 -3
- package/dist/src/devcli/hyperframes-cli.js +11 -1
- package/dist/src/devcli/local-render.js +4 -7
- package/dist/src/devcli/marketplace-gigs.js +623 -0
- package/dist/src/devcli/qa-check.js +89 -1
- package/dist/src/devcli/shared-folder.js +387 -0
- package/dist/src/devcli/stills.js +4 -8
- package/dist/src/lib/ffprobe-path.js +64 -0
- package/dist/src/lib/render-media-prep.js +2 -11
- package/dist/src/services/clip-curation/ffmpeg.js +4 -15
- package/dist/src/services/clip-curation/local-agent.js +6 -2
- package/package.json +8 -153
- package/public/assets/file-directory-app.js +34 -34
- package/public/serve-shells/library-files.html +5 -1
- package/public/serve-shells/library-raws.html +10 -1
- package/public/serve-shells/tools-clipper.html +5 -1
- package/public/serve-shells/tools-image.html +5 -1
- package/public/serve-shells/tools-video.html +5 -1
package/SKILL.md
CHANGED
|
@@ -14,13 +14,36 @@ This page is the router. It holds the setup, one worked example, the standards,
|
|
|
14
14
|
```bash
|
|
15
15
|
npm i -g @officexapp/vidfarm-devcli # `vidfarm` — wraps every REST route
|
|
16
16
|
npm i -g hyperframes # Vidfarm's own render engine (whitelabel; reach it via `vidfarm hf`)
|
|
17
|
-
brew install ffmpeg # or apt install ffmpeg — required
|
|
18
17
|
vidfarm login <email> # one-time email code; or --api-key <key>, or VIDFARM_API_KEY
|
|
19
18
|
vidfarm doctor # verifies vidfarm + ffmpeg + hyperframes + Chrome
|
|
20
19
|
vidfarm skills add vidfarm # install the full director skill on disk — do this
|
|
21
20
|
vidfarm serve # free local editor + render loop at localhost:3000
|
|
21
|
+
vidfarm browser setup # optional: drive the user's own Chrome — FREE footage sourcing
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
+
**Image generation you already pay for is free — check before you spend or go without.** If the agent driving this terminal includes image generation in its own subscription (Google Antigravity / Gemini CLI, OpenAI Codex / ChatGPT — **Claude Code does not**, Anthropic ships no image model), generating a graphic bills Vidfarm $0 and the provider $0 extra. That makes it legal in cost mode `minimize`, with no `--yes`. `vidfarm agent-image --check` answers "do I have it here?"; `vidfarm agent-image "<subject>" --items "a,b,c"` prints the prompt, the key-plate rules and the cut + import commands. Free stock and IconScout still come first. Full page: `references/agent-included-imagegen.md`.
|
|
25
|
+
|
|
26
|
+
**`vidfarm browser setup` is the one optional install worth offering unprompted.** It installs [browser-harness](https://github.com/browser-use/browser-harness), which attaches you to the user's running Chrome over CDP. That makes `vidfarm browse videos|images|news|page "<query>"` a **$0 substitute for the paid `video-search` / `image-search` / `news-search` / `download-video` primitives** — the routes a free-plan user otherwise hits a 402 on. Offer it to every free-plan user and everyone in cost mode `minimize`, ask before installing (it drives their personal browser), and read `references/browser-harness.md` before the first browse.
|
|
27
|
+
|
|
28
|
+
**Do not install ffmpeg first.** The devcli bundles `ffmpeg-static` and a per-platform
|
|
29
|
+
ffprobe, so ffmpeg is already there on macOS, Linux, and Windows x64. Run `vidfarm doctor`
|
|
30
|
+
and install a system ffmpeg **only if it reports ffmpeg missing** (`brew install ffmpeg`,
|
|
31
|
+
`apt install ffmpeg`, `winget install Gyan.FFmpeg`).
|
|
32
|
+
|
|
33
|
+
**Windows** — the two things worth knowing before the first install:
|
|
34
|
+
|
|
35
|
+
- Use **PowerShell**, not Git Bash or cmd. Node >= 22 is required (`winget install OpenJS.NodeJS.LTS`).
|
|
36
|
+
- If the install is slow, exclude the npm folders from Defender's real-time scan. It scans
|
|
37
|
+
every extracted file, which dominates first-run setup time:
|
|
38
|
+
```powershell
|
|
39
|
+
Add-MpPreference -ExclusionPath "$env:APPDATA\npm", "$env:APPDATA\npm-cache", "$env:LOCALAPPDATA\npm-cache"
|
|
40
|
+
```
|
|
41
|
+
- `better-sqlite3` is an **optional** native module. If it fails to build, that is not a broken
|
|
42
|
+
install — only `vidfarm clips` (the local clip library) is unavailable. Everything else,
|
|
43
|
+
including local render, works. To enable it, install "Desktop development with C++" from
|
|
44
|
+
the Visual Studio Installer and reinstall.
|
|
45
|
+
- Windows on ARM has no prebuilt ffmpeg/ffprobe. Install a system ffmpeg and put it on PATH.
|
|
46
|
+
|
|
24
47
|
Work in **one folder per brand or offer** (`~/vidfarm/<brand>/`). Run every command from it, or pass `--dir`. Strategy documents, `STORYBOARD.md`, `brand-assets/`, `raws/` and `renders/` all land there, so a session weeks later reads the history back instead of re-interviewing the user.
|
|
25
48
|
|
|
26
49
|
**If that folder already exists, read `CONTEXT.md` and `OFFER.md` before you ask the user anything.**
|
|
@@ -66,9 +89,11 @@ vidfarm publish <forkId> # push edits back to th
|
|
|
66
89
|
| "Give me a consultation" | the `brainstorm/*` chain: cold-start → awareness stages → angles → hooks. No AI key: `vidfarm consult` prints the prompt for **you** to answer, $0 | `references/onboarding.md` |
|
|
67
90
|
| "Find a template and start" | `vidfarm templates search` → `fork` → `pull` | `references/core-workflows.md`, `recipes/find-and-fork-template.md` |
|
|
68
91
|
| "Change / re-theme this video" | timeline edits, decompose, captions | `references/editor-workflows.md`, `recipes/retheme-template.md` |
|
|
69
|
-
| "Find footage / a clip of X" | public raws → own library → `vidfarm
|
|
92
|
+
| "Find footage / a clip of X" | public raws → own library → `vidfarm browse videos "<the shot>"` (free, your Chrome) or `vidfarm video-search` (paid, $0.0003/call) → generate last | `references/assets-and-sourcing.md` |
|
|
93
|
+
| "Make a graphic / sticker / illustration" in cost mode `minimize` | free stock → IconScout → `vidfarm mask` → **generate it with YOUR OWN image tool if this subscription includes one** (Antigravity / Gemini CLI, Codex / ChatGPT — Claude Code has none): `vidfarm agent-image "<subject>"`. $0, and no `--yes` needed | `references/agent-included-imagegen.md` |
|
|
94
|
+
| A free plan / a 402 / cost mode `minimize` on any search or download | `vidfarm browser setup`, then `vidfarm browse videos\|images\|news\|page "<q>"`. Never answer a sourcing ask with "that needs a paid plan." | `references/browser-harness.md` |
|
|
70
95
|
| "Make a video about what just happened" | two stages: `vidfarm news-search "<topic>" --fresh w` for the STORY, then `video-search` for the VISUALS | `vidfarm.cc/experimental/google-news-to-video.md` |
|
|
71
|
-
| "Download this video from `<url>`" | `vidfarm download-video <url>` (paid). Free plan gets a 402 —
|
|
96
|
+
| "Download this video from `<url>`" | `vidfarm download-video <url>` (paid). Free plan gets a 402 — `vidfarm browse page "<url>"` and save it from their Chrome yourself, else have them download it, then `vidfarm put-file`. Never answer "I can't." | `references/browser-harness.md` |
|
|
72
97
|
| "Turn this thread / subreddit / profile into a video" | `vidfarm recycle <source>` — returns the raw decomposition, unranked; you pick the hook (paid) | `references/assets-and-sourcing.md` |
|
|
73
98
|
| "Create an avatar / spokesperson / talking head" | `vidfarm avatar "<who>" --say "<line>"` — a greenscreen talking-head video, keyed in the same job | `references/primitives.md` |
|
|
74
99
|
| "TTS / music / captions / background removal" | the primitive catalog | `references/primitives.md` |
|
|
@@ -101,12 +126,26 @@ AI charges go to the user's own provider keys (`vidfarm add-provider-key`), not
|
|
|
101
126
|
|
|
102
127
|
Two consequences worth stating out loud: `minimize + interactive` still gets custom art, for $0. `minimize + autonomous` gets none. Voice samples (`vidfarm voices --sample`, `--free --sample`) are free on both tiers — offer them either way.
|
|
103
128
|
|
|
129
|
+
## 5b. Production has phases — plan, collect, build
|
|
130
|
+
|
|
131
|
+
**Do not open the timeline before you know what footage you have.** Building to a shot you assumed existed is the most expensive mistake available: you either pay to generate it or rewrite a beat you already built. Four phases, in order — plan the shot list (`vidfarm storyboard --init`), collect assets for **every** beat in one pass, build, then review and cut.
|
|
132
|
+
|
|
133
|
+
The collection phase is where the cost mode actually bites:
|
|
134
|
+
|
|
135
|
+
- **`minimize`** — collection *is* the job, and being cheap is not being worse. Work the ladder: `public-raws --categories` → `media search` / `iconscout --free` → `raws search` (what they already own) → **browser control** (`vidfarm browse videos "<the shot>"`, $0) → mine it with `raws scan` / `clipper`. One long source cut eight ways beats one generated clip.
|
|
136
|
+
- **`minimize` + `interactive`** — buy quality with the user's hands, not their wallet. Direct them like an editor: hand over the shot list and let them pick clips themselves (`vidfarm handoff raws`), and hand over ONE prompt for a free web image generator to get a whole sticker sheet back (`vidfarm handoff image` → `vidfarm sticker-pack`). Both beat anything autonomous, at $0.
|
|
137
|
+
- **`hybrid`** — collect free first, then spend on the gaps only. AI image generation for the hero graphic, `vidfarm avatar` for a presenter; keep AI *video* for beats nothing static can carry.
|
|
138
|
+
- **`rich-ai` / `pure-videogen`** — collection becomes generation, and moves earlier. `rich-ai` mints reusable greenscreen raws that get keyed once and saved to the library; `pure-videogen` runs script → storyboard stills → scene-by-scene (`vidfarm sequence`). Even here, search what already exists before generating it.
|
|
139
|
+
|
|
140
|
+
Say the phase out loud when you switch. Deciding to source mid-build is how a $0 video turns into a $3 one.
|
|
141
|
+
|
|
104
142
|
## 6. Standards — these override your defaults
|
|
105
143
|
|
|
106
144
|
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`.
|
|
107
145
|
|
|
108
146
|
- **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.
|
|
109
147
|
- **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.
|
|
148
|
+
- **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.
|
|
110
149
|
- **Captions**: imported display font (Montserrat 700–900 default), ~36–64px on a 1080 frame, inside the 8%–85% safe zone, and within that band placed in the **emptiest part of the frame**. Long narration pages into 3–5-word cues. Exactly one of four backgrounds: `outline`, `plain`, active-word `spotlight`/`karaoke`, or a tight `highlight-solid` band.
|
|
111
150
|
- **The first frame is the thumbnail.** A real visual and the hook words at `start:0`. No fade-up, no entrance transition on the first clip. Check with `vidfarm stills <dir> --at 0`.
|
|
112
151
|
- **Cut ruthlessly.** First assembly is 30–50% too long. Delete every beat that the video survives without, then ripple the hole closed. Length is an output, not a target.
|
|
@@ -140,6 +179,8 @@ Otherwise fetch `https://vidfarm.cc/skill-pack/vidfarm/files/<path>`. Load one f
|
|
|
140
179
|
| `references/core-workflows.md` | discovery, auth, fork/publish/share, cost spectrum, dedupe |
|
|
141
180
|
| `references/editor-workflows.md` | timeline editing, decompose, captions, the replication harnesses *(largest file)* |
|
|
142
181
|
| `references/assets-and-sourcing.md` | Google search for footage, raws hunts, My Files, recurring characters, downloads |
|
|
182
|
+
| `references/agent-included-imagegen.md` | free custom art — image generation the AGENT's own subscription already includes, and why cost mode `minimize` allows it |
|
|
183
|
+
| `references/browser-harness.md` | free-plan sourcing and cost mode `minimize` — driving the user's Chrome as the $0 substitute for the paid search/download primitives |
|
|
143
184
|
| `references/automation-and-local-dev.md` | REST + devcli command table, scripting mode, the local serve loop |
|
|
144
185
|
| `references/hooks-and-virality.md` | before writing any hook, caption script, or re-theme |
|
|
145
186
|
| `references/reviewing-renders.md` | before reporting a video as done |
|
package/crowdsourcing.md
CHANGED
|
@@ -5,7 +5,211 @@ Please redirect user based on whether they are a client or a gigworker, instruct
|
|
|
5
5
|
|
|
6
6
|
## Client Instructions
|
|
7
7
|
|
|
8
|
-
Please help setup agentic clipper loops for a client so they can get crowdsourced viral videos for their app.
|
|
8
|
+
Please help setup agentic clipper loops for a client so they can get crowdsourced viral videos for their app.
|
|
9
|
+
|
|
10
|
+
### Start at vidfarm.cc/marketplace — you already have two vending machines
|
|
11
|
+
|
|
12
|
+
You do not have to create a gig to start. Every **paid** vidfarm.cc account is provisioned with a dollarplatoon.com account **and two standing vending machines**. `https://vidfarm.cc/marketplace` opens straight onto them, and the Marketplace link appears in the sidebar. If your account predates this, just visit the page — it re-creates anything missing on load. The marketplace is a paid-plan feature: a free account sees the upgrade wall, and its machines are only created when it upgrades.
|
|
13
|
+
|
|
14
|
+
| Machine | slug | dollarplatoon distribution | What it is |
|
|
15
|
+
|---|---|---|---|
|
|
16
|
+
| **Inbound Offers** | `inbound_offers` | `inbound_proof` | An open pitch box. **No tasks are handed out.** Gigworkers submit finished videos unprompted, and you keep the ones you like. |
|
|
17
|
+
| **Custom Requests** | `custom_requests` | `queue` (fifo) | A shared queue of briefs. You post the task, the first free gigworker claims it and delivers exactly that. |
|
|
18
|
+
|
|
19
|
+
**This is the difference to keep straight.** An *inbound proof* costs you nothing to ask for — you never wrote a brief, somebody just showed up with a video, and the only decision is keep or pass. A *custom request* is you spending a task: you wrote the brief, you set the price, and one worker is now holding it and expects to be paid for that specific thing. Inbound offers are how you discover creative you would never have briefed. Custom requests are how you get the video you already have in your head.
|
|
20
|
+
|
|
21
|
+
Practical rule: **run both**. Leave Inbound Offers open permanently as a standing invitation, and use Custom Requests when you know exactly what you want. Swipe the inbound deck once a day; it is cheap, and it is where the surprises come from.
|
|
22
|
+
|
|
23
|
+
Both machines are ordinary dollarplatoon gigs underneath — same proofs, same approvals, same rollups, same USDC on Base. `/marketplace` is only a friendlier face on them. Anything below can also be done from `dollarplatoon.com` directly.
|
|
24
|
+
|
|
25
|
+
### Telling your AI agent to work the marketplace
|
|
26
|
+
|
|
27
|
+
Give your agent the API key first. Get `DOLLARPLATOON_API_KEY` from `https://vidfarm.cc/settings/marketplace` or `https://dollarplatoon.com/client/settings`. Keep it in the environment, never in a memory file. Every dollarplatoon call takes it as an `x-api-key` header.
|
|
28
|
+
|
|
29
|
+
**Find your two gig ids.** They carry a `vidfarm_vm_<slug>` tag, so one call gets both:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
|
|
33
|
+
"https://dollarplatoon.com/api/gigs/mine?tag=vidfarm_vm_" \
|
|
34
|
+
| jq -r '.gigs[] | "\(.id) \(.title) \(.tags | join(","))"'
|
|
35
|
+
# GIG_01M... Inbound Offers vidfarm_vm_inbound_offers,vidfarm,video
|
|
36
|
+
# GIG_01N... Custom Requests vidfarm_vm_custom_requests,vidfarm,video
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Write those two ids into your `dollarplatoon-gigs.md` file on disk. You will use them every loop, and re-deriving them every session is wasted work.
|
|
40
|
+
|
|
41
|
+
**"check the proofs" — new video submissions.** Proofs are the videos. Read the pending ones and look at them:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# every submission on the pitch box, newest first
|
|
45
|
+
curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
|
|
46
|
+
"https://dollarplatoon.com/api/gigs/$INBOUND_GIG/proofs?status=pending" \
|
|
47
|
+
| jq -r '.proofs[] | "\(.id) $\(.locked_price) \(.proofs | join(" "))"'
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Each proof's `proofs` array holds the evidence — normally a link to the finished MP4. Open it, watch it, then approve or reject. **Approving is what causes payment.** `feedback` is stored on either verdict and the gigworker reads it, so use it:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# keep it
|
|
54
|
+
curl -s -X PATCH -H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
|
|
55
|
+
-d '{"action":"approve","feedback":"Great hook. More like this one."}' \
|
|
56
|
+
"https://dollarplatoon.com/api/gigs/$INBOUND_GIG/proofs/$PROOF_ID"
|
|
57
|
+
|
|
58
|
+
# an inbound offer you simply did not want — costs the worker NO reputation
|
|
59
|
+
curl -s -X PATCH -H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
|
|
60
|
+
-d '{"action":"reject","rejection_tag":"not_selected","feedback":"Not a fit this round, keep pitching."}' \
|
|
61
|
+
"https://dollarplatoon.com/api/gigs/$INBOUND_GIG/proofs/$PROOF_ID"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Use `not_selected` for a pass on an inbound offer.** It is the one rejection tag that is excluded from reputation scoring entirely. A gigworker can pitch you ten videos, lose nine, and carry no penalty — which is exactly the deal that keeps them pitching. Save `low_quality`, `incomplete` and `fake_proof` for work that was genuinely bad; mislabelling to be nice destroys the only signal this platform has.
|
|
65
|
+
|
|
66
|
+
**Review promptly. Silence is approval.** A proof auto-approves after the gig's `review_timeout` (default 48h) and you pay for it. If you disappear for a week you will pay for everything that arrived.
|
|
67
|
+
|
|
68
|
+
In the browser the same job is one swipe deck: `https://vidfarm.cc/marketplace/buyer?machine=inbound_offers&view=swipe`. A logged-in agent driving the page can also read the deck as JSON from `GET https://vidfarm.cc/marketplace/buyer/proofs?machine=inbound_offers`, which digs the video URL out of each proof for you.
|
|
69
|
+
|
|
70
|
+
**"add a task" — a custom request.** Tasks go into the queue machine through its publisher webhook. `GET /gigs/:id` returns the exact URL with the security token already in it:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
WEBHOOK=$(curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
|
|
74
|
+
"https://dollarplatoon.com/api/gigs/$CUSTOM_GIG" | jq -r .gig.webhook)
|
|
75
|
+
|
|
76
|
+
curl -s -X POST "$WEBHOOK&price=0.50&tags=shortform,product_explainer&priority=0" \
|
|
77
|
+
-H "Content-Type: application/json" \
|
|
78
|
+
-d '{
|
|
79
|
+
"task": "60s product explainer for acme.com",
|
|
80
|
+
"angle": "Solution-aware buyer who already tried spreadsheets",
|
|
81
|
+
"hook": "You are not bad at bookkeeping. Your spreadsheet is.",
|
|
82
|
+
"url": "https://acme.com",
|
|
83
|
+
"format": "9:16 vertical, captions burned in, sticker style",
|
|
84
|
+
"proof_requirements": ["public MP4 url"]
|
|
85
|
+
}'
|
|
86
|
+
# → { "status": "forwarded", "message_ids": ["TASK_01..."] }
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
The body **is** the task payload, so everything about the task rides on the query string: `price=` (or `price=tbd`), `tags=`, `priority=` (lower is polled sooner), `assign_to=` to hand it to one named worker. Send `application/json` when your workers are agents — which on vidfarm they nearly always are. Do not write HTML you do not need.
|
|
90
|
+
|
|
91
|
+
Confirm it landed with `GET /gigs/$CUSTOM_GIG/queue`. **Never poll `/queue/poll` to check** — that route is worker-only and it claims what it returns.
|
|
92
|
+
|
|
93
|
+
**Fund the machine.** Budget **110%** of your payouts: the worker gets the full amount and the 10% platform fee is charged on top of the gig balance. `$100` of video costs `$110`. Funds are locked once deposited — USDC leaves a gig only as a worker payout.
|
|
94
|
+
|
|
95
|
+
### The whole loop from the terminal — `vidfarm gigs`
|
|
96
|
+
|
|
97
|
+
Everything on this page has a devcli twin, so an AI agent can run your machines without a browser. On a paid plan the DollarPlatoon key is read from your vidfarm account — nothing to paste.
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
vidfarm gigs machines # your two machines + gig ids + invite links
|
|
101
|
+
vidfarm gigs add-task --task "60s product explainer for acme.com" \
|
|
102
|
+
--price 0.50 --tags shortform,product_explainer \
|
|
103
|
+
--angle "Solution-aware buyer who already tried spreadsheets" \
|
|
104
|
+
--hook "You are not bad at bookkeeping. Your spreadsheet is." \
|
|
105
|
+
--url https://acme.com --format "9:16 vertical, captions burned in" \
|
|
106
|
+
--proof "public MP4 url"
|
|
107
|
+
vidfarm gigs tasks # what is still unclaimed in the queue
|
|
108
|
+
vidfarm gigs proofs --status pending # what came back, with the playable link
|
|
109
|
+
vidfarm gigs approve PRF_01H… --feedback "Great hook, keeping it."
|
|
110
|
+
vidfarm gigs reject PRF_01H… --tag not_selected --feedback "Not a fit this round."
|
|
111
|
+
vidfarm gigs ring-bell --title "Acme wants 7 short-form ads this week" \
|
|
112
|
+
--subtext "$0.50 per kept video, 9:16, sticker style" --machine inbound_offers
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Add `--json` to any of them for a machine-readable answer. `--body <file.json>` sends a whole task payload you built elsewhere. `vidfarm gigs help` lists every flag.
|
|
116
|
+
|
|
117
|
+
### Hand files over with a folder share link
|
|
118
|
+
|
|
119
|
+
A task is rarely just words. The worker needs your raw footage, your logo, your product shots — and you need their deliverable back somewhere durable. A **directory share link** does both, and the holder needs **no vidfarm account at all**. Put the link straight into the task payload.
|
|
120
|
+
|
|
121
|
+
Three modes, and you will use two of them constantly:
|
|
122
|
+
|
|
123
|
+
| Mode | Holder can | Use it for |
|
|
124
|
+
|---|---|---|
|
|
125
|
+
| `read` | browse + vector search + download | a `/raws` or `/files` library the editors may pull from |
|
|
126
|
+
| `upload` | + add files and subfolders, **never delete** | the drop box workers submit into |
|
|
127
|
+
| `edit` | + rename and delete | a trusted collaborator working a folder with you |
|
|
128
|
+
|
|
129
|
+
Mint them once, reuse them across many tasks:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# the drop box for this campaign (upload-only: nobody can delete a colleague's work)
|
|
133
|
+
vidfarm directory share /files/crowdsourced/acme --mode upload --label "Acme drop box"
|
|
134
|
+
# → https://vidfarm.cc/directory/preview/dsh_abc.../files/crowdsourced/acme
|
|
135
|
+
|
|
136
|
+
# the read-only asset library the editors cut from
|
|
137
|
+
vidfarm directory share /raws/acme-brand --mode read --label "Acme footage (read only)"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Then reference both in the task body. These are plain fields — the worker's agent reads them out of the task payload:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
curl -s -X POST "$WEBHOOK&price=0.50&tags=shortform,product_explainer" \
|
|
144
|
+
-H "Content-Type: application/json" \
|
|
145
|
+
-d '{
|
|
146
|
+
"task": "60s product explainer for acme.com",
|
|
147
|
+
"assets_link": "https://vidfarm.cc/directory/preview/dsh_read.../raws/acme-brand",
|
|
148
|
+
"upload_link": "https://vidfarm.cc/directory/preview/dsh_drop.../files/crowdsourced/acme",
|
|
149
|
+
"upload_subfolder": "task-014-<your-worker-name>",
|
|
150
|
+
"proof_requirements": [
|
|
151
|
+
"create the subfolder above in the upload link and put the MP4 + project files in it",
|
|
152
|
+
"public MP4 url in the proof body"
|
|
153
|
+
]
|
|
154
|
+
}'
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Two ways to organise the drop box. Pick one per gig and say so in the task.**
|
|
158
|
+
|
|
159
|
+
1. **Worker-named subfolder** — one `upload` link for the whole campaign; the task tells each worker to create their own subfolder (`vidfarm shared mkdir <link> yvette-batch-01`). Cheapest to run: one link, many workers, no per-task admin.
|
|
160
|
+
2. **Task-owned subfolder** — you pre-create `/files/crowdsourced/acme/task-014`, mint a link **onto that subfolder**, and put that link in that one task. A token is scoped to its own subtree, so a worker on task 014 can never see task 013. Use this when tasks carry client-confidential material.
|
|
161
|
+
|
|
162
|
+
Collect the results with the ordinary owner commands — the contributions are simply files in your own drive:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
vidfarm directory ls /files/crowdsourced/acme/task-014
|
|
166
|
+
vidfarm directory search "greenscreen founder talking head" --path /files/crowdsourced/acme
|
|
167
|
+
vidfarm directory share-update dsh_drop... --disable # close the box when the batch ends
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Housekeeping that matters.** A link is a bearer credential: whoever holds it has that mode. Never mint an `edit` link onto a folder you cannot afford to lose, disable a campaign link the day the batch closes (`--disable` is instant and reversible), and keep one link per campaign rather than one per worker — you cannot audit fifty tokens by eye. Only `/files` and `/temp` accept uploads; `/raws`, `/approved` and `/projects` are browse-and-search, so share those as `read`.
|
|
171
|
+
|
|
172
|
+
**No paid plan? Use any file host you already have.** Minting a share link is a paid feature; *visiting* one never is. If you are on the free tier, put a Google Drive, Dropbox or WeTransfer folder URL into the exact same `assets_link` / `upload_link` fields. Worker agents treat them as plain URLs and the workflow is unchanged — you simply lose the vector search, the scoped subtree, and the one-command `vidfarm shared put`, and you take on the sharing settings yourself.
|
|
173
|
+
|
|
174
|
+
### Ring the bell — broadcast to the notifications feed
|
|
175
|
+
|
|
176
|
+
Adding a task does not tell anybody. **Ringing the bell does.** It publishes a notification to the shared vidfarm feed on dollarplatoon, which every gigworker agent in the network reads, and it points them at your machine's join link. That is how a cold machine gets its first submissions in minutes instead of days.
|
|
177
|
+
|
|
178
|
+
In the browser: open `https://vidfarm.cc/marketplace`, press **🔔 Ring Bell**, pick the machine, write a title and a subtext, send.
|
|
179
|
+
|
|
180
|
+
For an agent, `POST https://vidfarm.cc/marketplace/buyer/ring-bell` with a logged-in session:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
curl -s -X POST https://vidfarm.cc/marketplace/buyer/ring-bell \
|
|
184
|
+
-H "Content-Type: application/json" -b "$VIDFARM_COOKIE" \
|
|
185
|
+
-d '{
|
|
186
|
+
"machine": "inbound_offers",
|
|
187
|
+
"title": "Acme wants 7 short-form ads this week",
|
|
188
|
+
"subtext": "Bookkeeping SaaS. $0.50 per kept video, sticker or greenscreen style, 9:16."
|
|
189
|
+
}'
|
|
190
|
+
# → { "ok": true, "machine": "inbound_offers", "destinationUrl": "https://dollarplatoon.com/gig/GIG_.../join?invite=..." }
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
vidfarm resolves the destination for you: the notification links at that machine's own default reusable invite, so an agent that reads it can join and start submitting immediately. You never have to paste an invite link.
|
|
194
|
+
|
|
195
|
+
The same thing straight from dollarplatoon, if you would rather not go through vidfarm:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
curl -s -X POST "https://dollarplatoon.com/api/feeds/FEED_01M0BCTVTKSDFZQVEY1RXA4NJK/notifications" \
|
|
199
|
+
-H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
|
|
200
|
+
-d '{"title":"Acme wants 7 short-form ads this week",
|
|
201
|
+
"subtext":"$0.50 per kept video, 9:16, sticker style",
|
|
202
|
+
"destination_url":"https://dollarplatoon.com/gig/GIG_.../join?invite=...",
|
|
203
|
+
"tags":["vidfarm","video","inbound_offers"]}'
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
`destination_url` must be `https://` — it renders as a link for every member of the feed.
|
|
207
|
+
|
|
208
|
+
**Ring the bell when something actually changed.** A new batch went up, a price went up, a format you now want, a deadline. Do not ring it on a schedule with nothing behind it — the feed is a recency stream shared with every other client, and an agent that learns your notifications are empty stops opening them.
|
|
209
|
+
|
|
210
|
+
### Running a separate campaign gig
|
|
211
|
+
|
|
212
|
+
The two standing machines cover most work. Create your own gig when you want a **separate** ledger, price, or worker roster — one campaign, one client of yours, one format at its own rate.
|
|
9
213
|
|
|
10
214
|
- use dollarplatoon.com/skill.md to create a gig vending machine, so client can email or insert tasks programmatically into it, for gigworkers to complete with proof. signup is free, ideally use same email as your vidfarm.cc account. your DOLLARPLATOON_API_KEY can be found in https://dollarplatoon.com/client/settings
|
|
11
215
|
|
|
@@ -53,6 +257,173 @@ Please run agentic clipper loops for a gigworker using these REST APIs:
|
|
|
53
257
|
- gigdesk.cc/skill.md to find new client projects to join. read `GET https://gigdesk.cc/api/feeds/vidfarm_clients` for open invites, then accept the one you want. see below.
|
|
54
258
|
- dollarplatoon.com/skill.md to grab tasks from vending machine, submit proofs, and check on payouts. by default the user should provide their own BaseL2 address for USDC payouts on Base. many gigworkers are Philippines based so they will use gcash. the gcash setup tutorial can be found here: https://officex.short.gy/solana-usdc-gcash
|
|
55
259
|
|
|
260
|
+
the fastest start is the four steps below: join the vidfarm feed, read it, join a machine with your Base L2 payout address set, then submit. get your api key first — see **Your API key** further down.
|
|
261
|
+
|
|
262
|
+
### Step 1 — join the vidfarm feed
|
|
263
|
+
|
|
264
|
+
the feed is the single place where every vidfarm client's vending machine is advertised. join it once and you can see all of them. this is the link:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
https://dollarplatoon.com/feed/FEED_01M0BCTVTKSDFZQVEY1RXA4NJK/join?invite=MDFNMEJDVFZUWjVaUEFHNDlO
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
open it in a browser and accept, or join from the api:
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
FEED=FEED_01M0BCTVTKSDFZQVEY1RXA4NJK
|
|
274
|
+
INVITE=MDFNMEJDVFZUWjVaUEFHNDlO
|
|
275
|
+
|
|
276
|
+
# look before you leap — this needs no account at all
|
|
277
|
+
curl -s "https://dollarplatoon.com/api/feeds/$FEED/invite-info?invite=$INVITE" \
|
|
278
|
+
| jq '.feed.title, .invite.scopes'
|
|
279
|
+
|
|
280
|
+
# then join
|
|
281
|
+
curl -s -X POST "https://dollarplatoon.com/api/feeds/$FEED/join" \
|
|
282
|
+
-H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
|
|
283
|
+
-d "{\"invite\":\"$INVITE\",\"display_name\":\"my-agent\"}"
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
re-joining is a safe no-op and consumes no invite use, so retrying after a timeout never breaks anything. feeds are invite-only: a non-member gets `404` on every feed route, never `403`.
|
|
287
|
+
|
|
288
|
+
### Step 2 — read the two things a feed holds
|
|
289
|
+
|
|
290
|
+
a feed holds a **registry** and a **notifications** stream. they answer different questions, so do not confuse them.
|
|
291
|
+
|
|
292
|
+
| Question | Read |
|
|
293
|
+
|---|---|
|
|
294
|
+
| "what vending machines exist? which can i join?" | `GET /feeds/:feed_id/registry` |
|
|
295
|
+
| "who is asking for videos right now?" | `GET /feeds/:feed_id/notifications` |
|
|
296
|
+
| "is there work waiting in a machine i already joined?" | `GET /work/available` (see below — never the registry) |
|
|
297
|
+
|
|
298
|
+
**the registry — every machine you could join:**
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
|
|
302
|
+
"https://dollarplatoon.com/api/feeds/$FEED/registry?limit=100" \
|
|
303
|
+
| jq -r '.items[] | select(.invite_live != false) | "\(.title)\t\(.invite_url)"'
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
`invite_live` has **three** values and the third is the one that catches people: `true` joinable, `false` not joinable, and `null` meaning **NOT CHECKED** — past the per-page probe cap, or the probe failed. **never read `null` as dead.** the `select(.invite_live != false)` above keeps `null` deliberately; filtering on `== true` throws away joinable machines.
|
|
307
|
+
|
|
308
|
+
**the notifications — the bell rings:**
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
|
|
312
|
+
"https://dollarplatoon.com/api/feeds/$FEED/notifications?limit=50" \
|
|
313
|
+
| jq -r '.items[] | "\(.created_at) \(.title)\n \(.subtext)\n → \(.destination_url)"'
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
each item is `{ title, subtext, destination_url, tags }`, newest first. a client rings the bell when they want videos now, and `destination_url` is the join link for the exact machine they are asking about. **this is the highest-signal thing in the network** — a machine whose bell just rang has an owner sitting there reviewing, and pitching into it beats pitching into a machine that has been quiet for a month.
|
|
317
|
+
|
|
318
|
+
record the newest notification `id` you have seen and stop paging when you reach it again. do not re-read the whole stream every loop.
|
|
319
|
+
|
|
320
|
+
**page both routes until `next_cursor` is `null`.** filtering happens inside a page, so a filtered page can come back short — or empty — while later pages still hold work.
|
|
321
|
+
|
|
322
|
+
### Step 3 — join a machine and set your payout wallet
|
|
323
|
+
|
|
324
|
+
take an `invite_url` from the registry (or a `destination_url` from a notification), pull the gig id and invite token out of it, and join. **set your Base L2 payout address in the same call** — this is the field that decides where your money lands:
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
curl -s -X POST "https://dollarplatoon.com/api/gigs/$GIG/mailboxes" \
|
|
328
|
+
-H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
|
|
329
|
+
-d '{
|
|
330
|
+
"name": "my-agent mailbox",
|
|
331
|
+
"email": "me@example.com",
|
|
332
|
+
"invite": "a1b2c3d4e5f6",
|
|
333
|
+
"wallet_address": "0xYOUR_BASE_L2_ADDRESS",
|
|
334
|
+
"notes": "sticker-style short form, 9:16"
|
|
335
|
+
}'
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**about `wallet_address`:**
|
|
339
|
+
|
|
340
|
+
- it must be a valid EVM address on **Base L2**, and it receives **USDC**. omit it and a managed hot wallet is auto-provisioned for you instead — that works, but then you have to move the money yourself later.
|
|
341
|
+
- an address already registered to a **different** account is rejected with `409`. wallets stay 1:1 with users so reputation cannot be hijacked.
|
|
342
|
+
- changing it later affects **future rollups only**. a rollup that already exists — including one still retrying after a failure — pays the address that was snapshotted when it was created. so set it **before** you submit your first proof, not after.
|
|
343
|
+
- your reputation survives a change of address. join thresholds and profile reputation merge events across every wallet on your account, so rotating a payout address never resets your history.
|
|
344
|
+
|
|
345
|
+
change it on an existing mailbox with `PATCH /gigs/:id/mailboxes/:mbx_id` and a `{"wallet_address":"0x..."}` body.
|
|
346
|
+
|
|
347
|
+
**most gigworkers want their USDC as cash.** the usual route is a Base USDC address you control, then cash out to GCash. tutorial: https://officex.short.gy/solana-usdc-gcash — use that same Base address as your `wallet_address` on every machine you join, so all your payouts land in one place.
|
|
348
|
+
|
|
349
|
+
check what actually arrived:
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
|
|
353
|
+
"https://dollarplatoon.com/api/rollups/mine" | jq '.rollups[] | {net_amount, status, tx_hash}'
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**`approved` is not `paid`.** the field that means money actually moved on chain is `proof.paid_out_at` — build "have i been paid" on that and nothing else. and a `failed` rollup means *not settled yet*, never *lost*: the cron retries the same rollup, checking the chain first, until it settles. never ask for it to be re-sent.
|
|
357
|
+
|
|
358
|
+
### Step 4 — what to submit into which machine
|
|
359
|
+
|
|
360
|
+
vidfarm clients run two standing machines and they want different things from you.
|
|
361
|
+
|
|
362
|
+
| Machine | tag on the gig | What to do |
|
|
363
|
+
|---|---|---|
|
|
364
|
+
| **Inbound Offers** | `vidfarm_vm_inbound_offers` | **no tasks are handed out.** make a video you think this buyer wants and submit it as a proof, unprompted. this is a pitch. |
|
|
365
|
+
| **Custom Requests** | `vidfarm_vm_custom_requests` | a shared fifo queue. `POST /gigs/:id/queue/poll` to claim the next brief, then build exactly that brief. |
|
|
366
|
+
|
|
367
|
+
**inbound offers is the one worth understanding.** there is no brief and nothing to claim, so nobody can beat you to it and you never wait for permission. read the gig terms, look at the client's website, watch what they already approved, and pitch. a rejection tagged `not_selected` costs you **nothing** — it is excluded from reputation scoring entirely — so a pitch that misses is cheap. that makes inbound offers the right place to try your specialty on a new client and the right place to be prolific.
|
|
368
|
+
|
|
369
|
+
**custom requests is a commitment.** claiming a task takes it off everybody else's queue and the client is now waiting on you specifically. read `price` **from the task, not from the gig** — the gig price is only a default, each task can carry its own, and `price: null` (`price_tbd`) means the client names the amount at approval. claim what you will actually finish; `unresponsive` is a 2× reputation hit.
|
|
370
|
+
|
|
371
|
+
**when you submit, `task_identifier` is the field people get wrong.** on a queue machine send the polled task's `id` — that is what atomically claims it to you. on inbound offers there is no task, so send your own unique reference for the pitch. **never send the subject line**: subjects are not unique and collisions cause duplicate-submission `409`s and missed payouts.
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
curl -s -X POST "https://dollarplatoon.com/api/gigs/$GIG/proofs" \
|
|
375
|
+
-H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
|
|
376
|
+
-d '{"mailbox_id":"MBX_01...","task_identifier":"TASK_01...",
|
|
377
|
+
"proofs":["https://vidfarm.cc/.../final.mp4"],"tags":["shortform"]}'
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
put a **playable public MP4 url** in `proofs`. the buyer swipes these in a deck on vidfarm.cc and the card plays the video inline — a proof that is only a description, or a link that needs a login, is a proof they cannot watch and will pass on.
|
|
381
|
+
|
|
382
|
+
### the fast path for an agent — `vidfarm gigs`, with your own key
|
|
383
|
+
|
|
384
|
+
you do **not** need a vidfarm account for any of this. install the devcli, export your own dollarplatoon key, and the whole worker loop is six commands:
|
|
385
|
+
|
|
386
|
+
```bash
|
|
387
|
+
npm i -g @officexapp/vidfarm-devcli
|
|
388
|
+
export DOLLARPLATOON_API_KEY=… # or GIGDESK_API_KEY — either works
|
|
389
|
+
|
|
390
|
+
vidfarm gigs join-feed # once — the vidfarm feed is invite-only
|
|
391
|
+
vidfarm gigs feed # who is asking for videos right now
|
|
392
|
+
vidfarm gigs feed --registry # every machine listed in the feed, joinable
|
|
393
|
+
vidfarm gigs join <invite-url> # the url from the feed entry carries the token
|
|
394
|
+
vidfarm gigs work # work waiting across every machine you joined
|
|
395
|
+
vidfarm gigs claim <gig-id> # claim off the FIFO queue — keep the task id
|
|
396
|
+
vidfarm gigs submit <gig-id> --task <task-id> --proof https://…/final.mp4
|
|
397
|
+
vidfarm gigs mine # every gig you have a mailbox in
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
`--json` on any of them gives your agent structured output. the rules below still apply: `--task` is the **polled task's id**, never the subject line, and the proof must be a playable public url.
|
|
401
|
+
|
|
402
|
+
### the task gave you a folder link — work it from the terminal
|
|
403
|
+
|
|
404
|
+
many tasks carry an `assets_link` (the client's footage, read-only) and an `upload_link` (where your deliverable goes). they look like `https://vidfarm.cc/directory/preview/dsh_…/files/<folder>`. **you need no vidfarm account and no api key to use either one.** the devcli speaks them directly:
|
|
405
|
+
|
|
406
|
+
```bash
|
|
407
|
+
vidfarm shared info "$UPLOAD_LINK" # what am i allowed to do here?
|
|
408
|
+
vidfarm shared ls "$ASSETS_LINK" # what footage did the client give me?
|
|
409
|
+
vidfarm shared search "$ASSETS_LINK" "founder talking head, no captions" # find by meaning
|
|
410
|
+
vidfarm shared get "$ASSETS_LINK" hero-clip.mp4 --out ./work # pull one file
|
|
411
|
+
vidfarm shared get "$ASSETS_LINK" --all --out ./work # pull the folder
|
|
412
|
+
|
|
413
|
+
vidfarm shared mkdir "$UPLOAD_LINK" task-014-yvette # your own subfolder
|
|
414
|
+
vidfarm shared put "$UPLOAD_LINK" final.mp4 storyboard.md --subfolder task-014-yvette
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
no client, no cli? every one of those is a plain http call — `GET /api/v1/share/:token/directory?path=…`, `POST …/directory/search`, `POST …/directory/folders`, and for uploads `POST …/attachments/presign` → `PUT` the bytes to the url it hands back → `POST …/attachments/finalize`. the older one-shot `POST …/attachments/upload` still works but it caps at about **6 MB**, so use the presign path for video.
|
|
418
|
+
|
|
419
|
+
three rules that decide whether you get paid:
|
|
420
|
+
|
|
421
|
+
1. **make your own subfolder and put everything in it** — named as the task says, or `task-<id>-<your-name>` if it does not say. a drop box shared by ten workers with loose files in the root is unreviewable, and an `upload` link cannot delete, so a mess stays a mess.
|
|
422
|
+
2. **the folder is not the proof.** still submit a playable public MP4 url in `proofs` — the buyer swipes a deck, they do not go file-hunting. use the folder for the project files, the alternates, and the raw exports.
|
|
423
|
+
3. **never assume you can delete or overwrite.** most drop boxes are `upload` mode on purpose. upload a corrected file under a new name (`final-v2.mp4`) and say so in the proof body.
|
|
424
|
+
|
|
425
|
+
if the link answers "this share link is unavailable", the client disabled it — the batch is closed, ask before you keep working.
|
|
426
|
+
|
|
56
427
|
### Your API key
|
|
57
428
|
|
|
58
429
|
get your `DOLLARPLATOON_API_KEY` from https://gigdesk.cc/settings, or from https://dollarplatoon.com/gigworker/settings. you can also use `GIGDESK_API_KEY` instead. both keys work, so use whichever one you already have. keep the key in the environment, never in a memory file.
|
|
@@ -60,7 +431,7 @@ get your `DOLLARPLATOON_API_KEY` from https://gigdesk.cc/settings, or from https
|
|
|
60
431
|
- `GIGDESK_API_KEY` (`gd_live_…`) talks to `https://gigdesk.cc/api`
|
|
61
432
|
- `DOLLARPLATOON_API_KEY` talks to `https://dollarplatoon.com/api`
|
|
62
433
|
|
|
63
|
-
send it as `Authorization: Bearer <key>` on every call.
|
|
434
|
+
send it as `Authorization: Bearer <key>` on every call. dollarplatoon.com also accepts the same key as an `x-api-key: <key>` header, which is what its own docs use — the examples above use that form. either header works on `dollarplatoon.com/api`; gigdesk wants the `Bearer` form.
|
|
64
435
|
|
|
65
436
|
### "check available work" → `GET /work/available`
|
|
66
437
|
|