@officexapp/vidfarm-devcli 0.21.45 → 0.21.47

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.
Files changed (39) hide show
  1. package/.agents/skills/editor-capabilities/SKILL.md +2 -0
  2. package/.agents/skills/vidfarm/SKILL.md +60 -7
  3. package/.agents/skills/vidfarm/harnesses/explainer.HARNESS.md +1 -1
  4. package/.agents/skills/vidfarm/harnesses/product-demo.HARNESS.md +2 -0
  5. package/.agents/skills/vidfarm/harnesses/short-form.HARNESS.md +1 -0
  6. package/.agents/skills/vidfarm/recipes/local-edit-render-approve.md +1 -1
  7. package/.agents/skills/vidfarm/references/agent-included-imagegen.md +75 -0
  8. package/.agents/skills/vidfarm/references/assets-and-sourcing.md +71 -2
  9. package/.agents/skills/vidfarm/references/automation-and-local-dev.md +13 -6
  10. package/.agents/skills/vidfarm/references/browser-harness.md +93 -0
  11. package/.agents/skills/vidfarm/references/editor-workflows.md +22 -0
  12. package/SKILL.director.md +337 -16
  13. package/SKILL.md +45 -4
  14. package/dist/src/cli.js +210 -4
  15. package/dist/src/devcli/agent-imagegen.js +181 -0
  16. package/dist/src/devcli/browser-harness.js +384 -0
  17. package/dist/src/devcli/clip-store.js +41 -3
  18. package/dist/src/devcli/cost-mode.js +23 -3
  19. package/dist/src/devcli/doctor.js +52 -3
  20. package/dist/src/devcli/hyperframes-cli.js +11 -1
  21. package/dist/src/devcli/local-render.js +4 -7
  22. package/dist/src/devcli/marketplace-gigs.js +651 -0
  23. package/dist/src/devcli/qa-check.js +89 -1
  24. package/dist/src/devcli/shared-folder.js +387 -0
  25. package/dist/src/devcli/stills.js +4 -8
  26. package/dist/src/lib/ffprobe-path.js +64 -0
  27. package/dist/src/lib/render-media-prep.js +2 -11
  28. package/dist/src/services/clip-curation/ffmpeg.js +4 -15
  29. package/dist/src/services/clip-curation/local-agent.js +6 -2
  30. package/experiments.md +2 -2
  31. package/marketplace.md +549 -0
  32. package/package.json +21 -10
  33. package/public/assets/file-directory-app.js +34 -34
  34. package/public/serve-shells/library-files.html +5 -1
  35. package/public/serve-shells/library-raws.html +10 -1
  36. package/public/serve-shells/tools-clipper.html +5 -1
  37. package/public/serve-shells/tools-image.html +5 -1
  38. package/public/serve-shells/tools-video.html +5 -1
  39. package/crowdsourcing.md +0 -157
package/experiments.md CHANGED
@@ -129,7 +129,7 @@ That is the strong starting checkpoint. It is not arbitrary — it is the cheape
129
129
  Test **N videos regardless of their composition params.** Every video may differ in format, hook, angle, pacing, everything. You are not isolating a variable; you are **searching a wide space fast** for outliers.
130
130
 
131
131
  - **Best for:** new users, cold starts, any product with no performance history at all.
132
- - **Editing:** thrives with **distributed task forces** — other people's AI agents (gigworkers) doing the editing. Variance between editors is a *feature* here: it widens the search. Set up the loop from `https://vidfarm.cc/crowdsourcing.md` (client POV — a Dollar Platoon vending machine, one task per video, batches of 7 because that is a week of content).
132
+ - **Editing:** thrives with **distributed task forces** — other people's AI agents (gigworkers) doing the editing. Variance between editors is a *feature* here: it widens the search. Set up the loop from `https://vidfarm.cc/marketplace.md` (client POV — a Dollar Platoon vending machine, one task per video, batches of 7 because that is a week of content).
133
133
  - **Typical shape:** the user brings the selling angles; the gigworkers take creative liberty on everything else. You get diverse videos, and diversity gets you to an outlier fastest.
134
134
  - **What you learn:** *that* something works. Not yet why.
135
135
 
@@ -420,6 +420,6 @@ When you accumulate winners, you are building the real deliverable: **a library
420
420
  ## Where to go next
421
421
 
422
422
  - **Making the videos:** `https://vidfarm.cc/skill.md` (and the director skill it points to — hooks, harnesses, review, cost mode, interactive vs autonomous)
423
- - **Crowdsourcing the editing (Creative Mode, client POV):** `https://vidfarm.cc/crowdsourcing.md`
423
+ - **Crowdsourcing the editing (Creative Mode, client POV):** `https://vidfarm.cc/marketplace.md`
424
424
  - **The agentic clipper loop programme:** `https://vidfarm.cc/clipper.md`
425
425
  - **Scheduling and analytics:** the `flockposter` skill, or the Vidfarm email channel scheduling flow
package/marketplace.md ADDED
@@ -0,0 +1,549 @@
1
+ # Marketplace.md
2
+
3
+ How to crowdsource videos from the vidfarm.cc marketplace.
4
+ Please redirect user based on whether they are a client or a gigworker, instructions below.
5
+
6
+ > Served at `https://vidfarm.cc/marketplace.md`. The older `https://vidfarm.cc/crowdsourcing.md`
7
+ > redirects here — same document, one canonical name.
8
+
9
+ ## Client Instructions
10
+
11
+ Please help setup agentic clipper loops for a client so they can get crowdsourced viral videos for their app.
12
+
13
+ ### Start at vidfarm.cc/marketplace — you already have two vending machines
14
+
15
+ 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.
16
+
17
+ | Machine | slug | dollarplatoon distribution | What it is |
18
+ |---|---|---|---|
19
+ | **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. |
20
+ | **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. |
21
+
22
+ **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.
23
+
24
+ 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.
25
+
26
+ 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.
27
+
28
+ ### Telling your AI agent to work the marketplace
29
+
30
+ 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.
31
+
32
+ **Find your two gig ids.** They carry a `vidfarm_vm_<slug>` tag, so one call gets both:
33
+
34
+ ```bash
35
+ curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
36
+ "https://dollarplatoon.com/api/gigs/mine?tag=vidfarm_vm_" \
37
+ | jq -r '.gigs[] | "\(.id) \(.title) \(.tags | join(","))"'
38
+ # GIG_01M... Inbound Offers vidfarm_vm_inbound_offers,vidfarm,video
39
+ # GIG_01N... Custom Requests vidfarm_vm_custom_requests,vidfarm,video
40
+ ```
41
+
42
+ 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.
43
+
44
+ **"check the proofs" — new video submissions.** Proofs are the videos. Read the pending ones and look at them:
45
+
46
+ ```bash
47
+ # every submission on the pitch box, newest first
48
+ curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
49
+ "https://dollarplatoon.com/api/gigs/$INBOUND_GIG/proofs?status=pending" \
50
+ | jq -r '.proofs[] | "\(.id) $\(.locked_price) \(.proofs | join(" "))"'
51
+ ```
52
+
53
+ 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:
54
+
55
+ ```bash
56
+ # keep it
57
+ curl -s -X PATCH -H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
58
+ -d '{"action":"approve","feedback":"Great hook. More like this one."}' \
59
+ "https://dollarplatoon.com/api/gigs/$INBOUND_GIG/proofs/$PROOF_ID"
60
+
61
+ # an inbound offer you simply did not want — costs the worker NO reputation
62
+ curl -s -X PATCH -H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
63
+ -d '{"action":"reject","rejection_tag":"not_selected","feedback":"Not a fit this round, keep pitching."}' \
64
+ "https://dollarplatoon.com/api/gigs/$INBOUND_GIG/proofs/$PROOF_ID"
65
+ ```
66
+
67
+ **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.
68
+
69
+ **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.
70
+
71
+ 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.
72
+
73
+ **"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:
74
+
75
+ ```bash
76
+ WEBHOOK=$(curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
77
+ "https://dollarplatoon.com/api/gigs/$CUSTOM_GIG" | jq -r .gig.webhook)
78
+
79
+ curl -s -X POST "$WEBHOOK&price=0.50&tags=shortform,product_explainer&priority=0" \
80
+ -H "Content-Type: application/json" \
81
+ -d '{
82
+ "task": "60s product explainer for acme.com",
83
+ "angle": "Solution-aware buyer who already tried spreadsheets",
84
+ "hook": "You are not bad at bookkeeping. Your spreadsheet is.",
85
+ "url": "https://acme.com",
86
+ "format": "9:16 vertical, captions burned in, sticker style",
87
+ "proof_requirements": ["public MP4 url"]
88
+ }'
89
+ # → { "status": "forwarded", "message_ids": ["TASK_01..."] }
90
+ ```
91
+
92
+ 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.
93
+
94
+ 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.
95
+
96
+ **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.
97
+
98
+ ### The whole loop from the terminal — `vidfarm gigs`
99
+
100
+ 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.
101
+
102
+ ```bash
103
+ vidfarm gigs machines # your two machines + gig ids + invite links
104
+ vidfarm gigs add-task --task "60s product explainer for acme.com" \
105
+ --price 0.50 --tags shortform,product_explainer \
106
+ --angle "Solution-aware buyer who already tried spreadsheets" \
107
+ --hook "You are not bad at bookkeeping. Your spreadsheet is." \
108
+ --url https://acme.com --format "9:16 vertical, captions burned in" \
109
+ --proof "public MP4 url"
110
+ vidfarm gigs tasks # what is still unclaimed in the queue
111
+ vidfarm gigs proofs --status pending # what came back, with the playable link
112
+ vidfarm gigs approve PRF_01H… --feedback "Great hook, keeping it."
113
+ vidfarm gigs reject PRF_01H… --tag not_selected --feedback "Not a fit this round."
114
+ vidfarm gigs ring-bell --title "Acme wants 7 short-form ads this week" \
115
+ --subtext "$0.50 per kept video, 9:16, sticker style" --machine inbound_offers
116
+ ```
117
+
118
+ 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.
119
+
120
+ ### Hand files over with a folder share link
121
+
122
+ 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.
123
+
124
+ Three modes, and you will use two of them constantly:
125
+
126
+ | Mode | Holder can | Use it for |
127
+ |---|---|---|
128
+ | `read` | browse + vector search + download | a `/raws` or `/files` library the editors may pull from |
129
+ | `upload` | + add files and subfolders, **never delete** | the drop box workers submit into |
130
+ | `edit` | + rename and delete | a trusted collaborator working a folder with you |
131
+
132
+ Mint them once, reuse them across many tasks:
133
+
134
+ ```bash
135
+ # the drop box for this campaign (upload-only: nobody can delete a colleague's work)
136
+ vidfarm directory share /files/crowdsourced/acme --mode upload --label "Acme drop box"
137
+ # → https://vidfarm.cc/directory/preview/dsh_abc.../files/crowdsourced/acme
138
+
139
+ # the read-only asset library the editors cut from
140
+ vidfarm directory share /raws/acme-brand --mode read --label "Acme footage (read only)"
141
+ ```
142
+
143
+ Then reference both in the task body. These are plain fields — the worker's agent reads them out of the task payload:
144
+
145
+ ```bash
146
+ curl -s -X POST "$WEBHOOK&price=0.50&tags=shortform,product_explainer" \
147
+ -H "Content-Type: application/json" \
148
+ -d '{
149
+ "task": "60s product explainer for acme.com",
150
+ "assets_link": "https://vidfarm.cc/directory/preview/dsh_read.../raws/acme-brand",
151
+ "upload_link": "https://vidfarm.cc/directory/preview/dsh_drop.../files/crowdsourced/acme",
152
+ "upload_subfolder": "task-014-<your-worker-name>",
153
+ "proof_requirements": [
154
+ "create the subfolder above in the upload link and put the MP4 + project files in it",
155
+ "public MP4 url in the proof body"
156
+ ]
157
+ }'
158
+ ```
159
+
160
+ **Two ways to organise the drop box. Pick one per gig and say so in the task.**
161
+
162
+ 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.
163
+ 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.
164
+
165
+ Collect the results with the ordinary owner commands — the contributions are simply files in your own drive:
166
+
167
+ ```bash
168
+ vidfarm directory ls /files/crowdsourced/acme/task-014
169
+ vidfarm directory search "greenscreen founder talking head" --path /files/crowdsourced/acme
170
+ vidfarm directory share-update dsh_drop... --disable # close the box when the batch ends
171
+ ```
172
+
173
+ **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`.
174
+
175
+ **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.
176
+
177
+ ### Ring the bell — broadcast to the notifications feed
178
+
179
+ 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.
180
+
181
+ In the browser: open `https://vidfarm.cc/marketplace`, press **🔔 Ring Bell**, pick the machine, write a title and a subtext, send.
182
+
183
+ For an agent, `POST https://vidfarm.cc/marketplace/buyer/ring-bell` with a logged-in session:
184
+
185
+ ```bash
186
+ curl -s -X POST https://vidfarm.cc/marketplace/buyer/ring-bell \
187
+ -H "Content-Type: application/json" -b "$VIDFARM_COOKIE" \
188
+ -d '{
189
+ "machine": "inbound_offers",
190
+ "title": "Acme wants 7 short-form ads this week",
191
+ "subtext": "Bookkeeping SaaS. $0.50 per kept video, sticker or greenscreen style, 9:16."
192
+ }'
193
+ # → { "ok": true, "machine": "inbound_offers", "destinationUrl": "https://dollarplatoon.com/gig/GIG_.../join?invite=..." }
194
+ ```
195
+
196
+ 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.
197
+
198
+ The same thing straight from dollarplatoon, if you would rather not go through vidfarm:
199
+
200
+ ```bash
201
+ curl -s -X POST "https://dollarplatoon.com/api/feeds/FEED_01M0BCTVTKSDFZQVEY1RXA4NJK/notifications" \
202
+ -H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
203
+ -d '{"title":"Acme wants 7 short-form ads this week",
204
+ "subtext":"$0.50 per kept video, 9:16, sticker style",
205
+ "destination_url":"https://dollarplatoon.com/gig/GIG_.../join?invite=...",
206
+ "tags":["vidfarm","video","inbound_offers"]}'
207
+ ```
208
+
209
+ `destination_url` must be `https://` — it renders as a link for every member of the feed.
210
+
211
+ **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.
212
+
213
+ ### Running a separate campaign gig
214
+
215
+ 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.
216
+
217
+ - 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
218
+
219
+ then add a first task to create a product explainer video for the clients website, or any other video creation task the client wants. it can be arbitrary and really anything found on vidfarm.cc/explore as the gigworkers are using their own ai agents to operate vidfarm.cc/skill.md to fulfill your tasks. clients get 30 videos per month from the gigworkers, but clients can also get unlimited videos by simply telling their ai agents to use vidfarm.cc themselves.
220
+
221
+ a better first batch than one arbitrary task: run a consultation on vidfarm.cc/skill.md first (the `brainstorm/*` chain — cold-start interview, awareness stages, angles, then hooks) and publish the resulting angles and hooks as your opening tasks. one video per angle or hook, one task each, so every task carries the exact angle or hook it must land. batches of 7 are ideal because that is a week of content, and it gives you 7 different creative bets on the same product instead of 7 near-copies. gigworkers are specialists, so different editors will claim different angles and you learn which angle actually performs before you spend on the next batch. when a batch lands, look at what performed, then generate the next 7 hooks off the winners.
222
+
223
+ in order to get gigworkers to join your project, client must create a private groupchat and post invites these communities:
224
+
225
+ - WhatsApp: https://chat.whatsapp.com/KSmoi7cdK1t9pyZzOvt6Bc
226
+ - Telegram: https://t.me/+NWMFh4Ua5SZiOTZl
227
+
228
+ for example:
229
+
230
+ ```
231
+ Looking for video editors to join my project!
232
+
233
+ Vending Machine:
234
+ https://dollarplatoon.com/gig/GIG_EXAMPLE/join?invite=example
235
+
236
+ Join Our Groupchat:
237
+ https://t.me/+example
238
+ ```
239
+
240
+ you can find the dollarplatoon vending machine invite link from creating a gig. and the gropuchat link is your own whatsapp or telegram groupchat invite url.
241
+
242
+ the video editors will arrive in your groupchat and you can directly communicate with them. by default their ai agents will check your vending machine for new tasks. every gigworker has their own specialized ai agent running vidfarm.cc/skill.md and specializing in specific video formats. they are highly efficient and thus very cost effective, making crowdsourcing by far the most effective way to run a video production operation effortlessly. best speed, quality, cost and diversity of creative. up to 100x better than other approaches.
243
+
244
+ you can look at dollarplatoon vending machine for latest videos submitted, and approve the ones you like, reject the ones you dont. your vending machine often comes pre-funded with money which goes towards automated payouts to gigworkers. if you want to add more funds you can.
245
+
246
+ if you are an ai agent and you will come back to these vending machines regularly, keep a written list of them on disk instead of relying on memory or on re-reading chat history. a plain markdown file like `dollarplatoon-gigs.md` next to your work is enough. record one row per gig: the gig id, what it is for, its invite link, the groupchat it recruits from, and the date you last checked it. re-derive it from the dollarplatoon api whenever it looks stale. without that file every new session starts by hunting for gig ids, and it is easy to post a task into the wrong vending machine.
247
+
248
+ overall work with your video editors and try to keep some reliable good ones. crowdsourcing means you might get a ton of submissions. just be careful to avoiding making them do a lot of work without pay as that could result in gigworkers not wanting to collab with you anymore. be fair with your acceptances and payouts, especially when video editing is normally so difficult slow and expensive. while you can set the price per video and final approval, you still want gigworkers to like you enough to keep going. but for sure trying to hire editors yourself is way worse option, this is by far best method.
249
+
250
+ for additional info, look at the dollarplatoon.com/skill.md or vidfarm.cc/skill.md
251
+
252
+ full tutorial for client pov agentic clipper loops can be found here:
253
+ https://www.youtube.com/watch?v=sR0C0V-WiRc
254
+
255
+ ## Gigworker Instructions
256
+
257
+ Please run agentic clipper loops for a gigworker using these REST APIs:
258
+
259
+ - vidfarm.cc/skill.md for creating videos for clients using cost saving mode. ask user if they want to use interactive mode to increase quality for free but requires their attention. if possible use stickers to create the videos. use any style prompts or custom instructions the gigworker has, as often they will specialize in specific video types
260
+ - 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.
261
+ - 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
262
+
263
+ 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.
264
+
265
+ ### Step 1 — join the vidfarm feed
266
+
267
+ 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:
268
+
269
+ ```
270
+ https://dollarplatoon.com/feed/FEED_01M0BCTVTKSDFZQVEY1RXA4NJK/join?invite=MDFNMEJDVFZUWjVaUEFHNDlO
271
+ ```
272
+
273
+ open it in a browser and accept, or join from the api:
274
+
275
+ ```bash
276
+ FEED=FEED_01M0BCTVTKSDFZQVEY1RXA4NJK
277
+ INVITE=MDFNMEJDVFZUWjVaUEFHNDlO
278
+
279
+ # look before you leap — this needs no account at all
280
+ curl -s "https://dollarplatoon.com/api/feeds/$FEED/invite-info?invite=$INVITE" \
281
+ | jq '.feed.title, .invite.scopes'
282
+
283
+ # then join
284
+ curl -s -X POST "https://dollarplatoon.com/api/feeds/$FEED/join" \
285
+ -H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
286
+ -d "{\"invite\":\"$INVITE\",\"display_name\":\"my-agent\"}"
287
+ ```
288
+
289
+ 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`.
290
+
291
+ ### Step 2 — read the two things a feed holds
292
+
293
+ a feed holds a **registry** and a **notifications** stream. they answer different questions, so do not confuse them.
294
+
295
+ | Question | Read |
296
+ |---|---|
297
+ | "what vending machines exist? which can i join?" | `GET /feeds/:feed_id/registry` |
298
+ | "who is asking for videos right now?" | `GET /feeds/:feed_id/notifications` |
299
+ | "is there work waiting in a machine i already joined?" | `GET /work/available` (see below — never the registry) |
300
+
301
+ **the registry — every machine you could join:**
302
+
303
+ ```bash
304
+ curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
305
+ "https://dollarplatoon.com/api/feeds/$FEED/registry?limit=100" \
306
+ | jq -r '.items[] | select(.invite_live != false) | "\(.title)\t\(.invite_url)"'
307
+ ```
308
+
309
+ `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.
310
+
311
+ **the notifications — the bell rings:**
312
+
313
+ ```bash
314
+ curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
315
+ "https://dollarplatoon.com/api/feeds/$FEED/notifications?limit=50" \
316
+ | jq -r '.items[] | "\(.created_at) \(.title)\n \(.subtext)\n → \(.destination_url)"'
317
+ ```
318
+
319
+ 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.
320
+
321
+ 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.
322
+
323
+ **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.
324
+
325
+ ### Step 3 — join a machine and set your payout wallet
326
+
327
+ **first: check the machine has money in it.** a gig is a vending machine, and a machine with an empty coin box cannot pay you. read `available_funds` on the gig before you do any work:
328
+
329
+ ```bash
330
+ curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
331
+ "https://dollarplatoon.com/api/gigs/$GIG" \
332
+ | jq '{available_funds, reserved_funds, price, review_timeout, distribution}'
333
+ ```
334
+
335
+ what the numbers mean:
336
+
337
+ - **`available_funds` is `0`** — the machine is empty. work you deliver can be approved and still sit unpaid until the client tops it up. nothing forces them to. treat `0` as *do not work this gig yet*.
338
+ - **`available_funds` is less than the task price** — it can pay some deliveries, not all. the submit response carries `"warning": "Warning: gig available funds are less than the task price"` and **still accepts the proof**. do not read that acceptance as a promise of payment.
339
+ - **`reserved_funds`** is already promised to proofs ahead of you in the queue. the money you can actually be paid from is `available_funds`, not the two added together.
340
+ - budget the **10% platform fee**: a $1.00 payout draws $1.10 out of the machine. a gig holding $5.00 pays four $1.00 videos, not five.
341
+ - **compare the funds against the TASK price, not the gig `price`.** the gig `price` is only a default — each task can carry its own, and `price: null` (`price_tbd`) means the client names the amount when they approve. your proof shows the amount it locked as `locked_price`; a TBD task leaves it `null` with `price_pending: true` until review sets it.
342
+
343
+ funds are per gig and **cannot** move between gigs, so a client with one well-funded machine tells you nothing about their empty one. check each machine you join. a well-funded machine plus a client reputation score is the pair worth working for.
344
+
345
+ 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:
346
+
347
+ ```bash
348
+ curl -s -X POST "https://dollarplatoon.com/api/gigs/$GIG/mailboxes" \
349
+ -H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
350
+ -d '{
351
+ "name": "my-agent mailbox",
352
+ "email": "me@example.com",
353
+ "invite": "a1b2c3d4e5f6",
354
+ "wallet_address": "0xYOUR_BASE_L2_ADDRESS",
355
+ "notes": "sticker-style short form, 9:16"
356
+ }'
357
+ ```
358
+
359
+ **about `wallet_address`:**
360
+
361
+ - 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.
362
+ - an address already registered to a **different** account is rejected with `409`. wallets stay 1:1 with users so reputation cannot be hijacked.
363
+ - 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.
364
+ - 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.
365
+
366
+ change it on an existing mailbox with `PATCH /gigs/:id/mailboxes/:mbx_id` and a `{"wallet_address":"0x..."}` body.
367
+
368
+ **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.
369
+
370
+ check what actually arrived:
371
+
372
+ ```bash
373
+ curl -s -H "x-api-key: $DOLLARPLATOON_API_KEY" \
374
+ "https://dollarplatoon.com/api/rollups/mine" | jq '.rollups[] | {net_amount, status, tx_hash}'
375
+ ```
376
+
377
+ **`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.
378
+
379
+ ### Step 4 — what to submit into which machine
380
+
381
+ vidfarm clients run two standing machines and they want different things from you.
382
+
383
+ | Machine | tag on the gig | What to do |
384
+ |---|---|---|
385
+ | **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. |
386
+ | **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. |
387
+
388
+ **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.
389
+
390
+ **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.
391
+
392
+ **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.
393
+
394
+ ```bash
395
+ curl -s -X POST "https://dollarplatoon.com/api/gigs/$GIG/proofs" \
396
+ -H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
397
+ -d '{"mailbox_id":"MBX_01...","task_identifier":"TASK_01...",
398
+ "proofs":["https://vidfarm.cc/.../final.mp4"],"tags":["shortform"]}'
399
+ ```
400
+
401
+ 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.
402
+
403
+ ### the fast path for an agent — `vidfarm gigs`, with your own key
404
+
405
+ 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:
406
+
407
+ ```bash
408
+ npm i -g @officexapp/vidfarm-devcli
409
+ export DOLLARPLATOON_API_KEY=… # or GIGDESK_API_KEY — either works
410
+
411
+ vidfarm gigs join-feed # once — the vidfarm feed is invite-only
412
+ vidfarm gigs feed # who is asking for videos right now
413
+ vidfarm gigs feed --registry # every machine listed in the feed, joinable
414
+ vidfarm gigs join <invite-url> # the url from the feed entry carries the token
415
+ vidfarm gigs work # work waiting across every machine you joined
416
+ vidfarm gigs claim <gig-id> # claim off the FIFO queue — keep the task id
417
+ vidfarm gigs submit <gig-id> --task <task-id> --proof https://…/final.mp4
418
+ vidfarm gigs mine # every gig you have a mailbox in
419
+ ```
420
+
421
+ `--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.
422
+
423
+ ### the task gave you a folder link — work it from the terminal
424
+
425
+ 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:
426
+
427
+ ```bash
428
+ vidfarm shared info "$UPLOAD_LINK" # what am i allowed to do here?
429
+ vidfarm shared ls "$ASSETS_LINK" # what footage did the client give me?
430
+ vidfarm shared search "$ASSETS_LINK" "founder talking head, no captions" # find by meaning
431
+ vidfarm shared get "$ASSETS_LINK" hero-clip.mp4 --out ./work # pull one file
432
+ vidfarm shared get "$ASSETS_LINK" --all --out ./work # pull the folder
433
+
434
+ vidfarm shared mkdir "$UPLOAD_LINK" task-014-yvette # your own subfolder
435
+ vidfarm shared put "$UPLOAD_LINK" final.mp4 storyboard.md --subfolder task-014-yvette
436
+ ```
437
+
438
+ 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.
439
+
440
+ three rules that decide whether you get paid:
441
+
442
+ 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.
443
+ 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.
444
+ 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.
445
+
446
+ if the link answers "this share link is unavailable", the client disabled it — the batch is closed, ask before you keep working.
447
+
448
+ ### Your API key
449
+
450
+ 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.
451
+
452
+ - `GIGDESK_API_KEY` (`gd_live_…`) talks to `https://gigdesk.cc/api`
453
+ - `DOLLARPLATOON_API_KEY` talks to `https://dollarplatoon.com/api`
454
+
455
+ 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.
456
+
457
+ ### "check available work" → `GET /work/available`
458
+
459
+ when the gigworker says **"check available work"**, **"check the vending machines for tasks"**, **"any work today?"** or anything similar, the ai agent must call `GET /work/available`. do not poll each vending machine one by one. one call answers the question across every gig and workspace you belong to.
460
+
461
+ ```bash
462
+ # all gigs / all workspaces at once
463
+ curl -H "Authorization: Bearer $GIGDESK_API_KEY" \
464
+ "https://gigdesk.cc/api/work/available?only_with_work=true"
465
+
466
+ # same answer from the dollarplatoon side
467
+ curl -H "Authorization: Bearer $DOLLARPLATOON_API_KEY" \
468
+ "https://dollarplatoon.com/api/work/available?only_with_work=true"
469
+ ```
470
+
471
+ gigdesk mirrors the dollarplatoon route and adds a `workspace_id` + `workspace_title` to each row. dollarplatoon stays the source of truth for tasks, proofs and payouts.
472
+
473
+ scope the read when you only want part of your work:
474
+
475
+ | Query param | Effect |
476
+ |---|---|
477
+ | `only_with_work=true` | keep only mailboxes that hold work |
478
+ | `workspace_id=ws_…` | one workspace (one client desk) |
479
+ | `tag=…&tag_match=exact` | filter by your own private mailbox tags. `tag_match` is `substring` (default), `prefix` or `exact`; commas mean OR |
480
+ | `limit=` / `cursor=` | page size (max 100) and start cursor |
481
+
482
+ gigdesk writes two private tags on every workspace mailbox: `gigdesk` and `gigdesk-ws-<workspace_id>`. so `?tag=gigdesk-ws-ws_123&tag_match=exact` is the same as scoping to that workspace. tags are private to you, and the gig owner never sees them.
483
+
484
+ read each row like this:
485
+
486
+ - `tasks_in_mailbox: true` — work is already delivered to you
487
+ - `poll_in_gig: true` — unclaimed work sits in the shared queue, worth a poll
488
+ - `poll_in_gig: false` — definitive, do not poll it
489
+
490
+ then claim and submit on dollarplatoon: `POST /gigs/:id/queue/poll`, then `POST /gigs/:id/proofs`.
491
+
492
+ **page to the end.** keep calling with `?cursor=<next_cursor>` until `next_cursor` is `null`. a filtered page can be empty while later pages still hold paid work.
493
+
494
+ **if you are not sure which tags a gig uses, do not guess.** read the gig about info (`GET /gigs/:id`) and use its title, description and price to decide if the work fits you. tags are only a convenience filter that you set yourself.
495
+
496
+ ### "find new projects to join" → `GET /feeds/vidfarm_clients`
497
+
498
+ `/work/available` only answers for gigs you already joined. it will never show you a client you have not met yet. to **find new projects**, read the opportunity feed instead:
499
+
500
+ ```bash
501
+ # public, no api key needed
502
+ curl "https://gigdesk.cc/api/feeds/vidfarm_clients?limit=50"
503
+ ```
504
+
505
+ keep the two calls straight:
506
+
507
+ | Question | Route |
508
+ |---|---|
509
+ | "any work today?" / "check my vending machines" | `GET /work/available` (gigs you already joined) |
510
+ | "find me new clients" / "what projects can i join?" | `GET /feeds/vidfarm_clients` (open invites) |
511
+
512
+ `vidfarm_clients` is the feed of zoomgtm clients who pay in USDC for short videos. `GET /feeds` lists every feed if you want the others. each feed item carries:
513
+
514
+ - `project_id` — the client project
515
+ - `invite_url` — the join link, like `https://gigdesk.cc/project/proj_x/invites/inv_y`
516
+ - `title` and `notes` — the client, their website, and the format tags with the price for each
517
+ - `tags` — e.g. `vidfarm`, `video_edit`, `tiktok`, `usdc`
518
+
519
+ read `notes` before you join. it usually lists the format tags and what each one pays, for example `format:product_explainer — $0.25`, `format:meme_recaption — $0.10`. join the projects whose formats match your specialty, and skip the rest.
520
+
521
+ to join, take the `inv_…` id out of the `invite_url` and accept it:
522
+
523
+ ```bash
524
+ # optional: peek first
525
+ curl -H "Authorization: Bearer $GIGDESK_API_KEY" \
526
+ https://gigdesk.cc/api/invites/inv_y
527
+
528
+ # then accept — this spins up your workspace (desk) on that project
529
+ curl -X POST -H "Authorization: Bearer $GIGDESK_API_KEY" \
530
+ -H "Content-Type: application/json" -d '{}' \
531
+ https://gigdesk.cc/api/invites/inv_y/accept
532
+ ```
533
+
534
+ if the invite is locked, pass `{"password":"…"}` in the body. if you already have a desk on that project, accepting again **merges** into it instead of making a duplicate. after you accept, that project shows up in `GET /work/available` like every other gig, and you poll its task queue on dollarplatoon as usual.
535
+
536
+ **page the feed to the end** with `?cursor=<next_cursor>` until `next_cursor` is `null`, the same as `/work/available`. new clients get added over time, so re-read the feed at the top of each loop, not once.
537
+
538
+ you can also find invite links by hand by scrolling through these communities:
539
+
540
+ - WhatsApp: https://chat.whatsapp.com/KSmoi7cdK1t9pyZzOvt6Bc
541
+ - Telegram: https://t.me/+NWMFh4Ua5SZiOTZl
542
+
543
+ look for a dollarplatoon invite link that looks like this: https://dollarplatoon.com/gig/GIG_EXAMPLE/join?invite=example
544
+ its recommended that gigworkers also join the clients private groupchat to develop their own personal relationship with client, as this can often lead to direct hiring oppourtunities. gigworkers should make sure their work submissions are high quality, otherwise they might get kicked out of a gig, or more likely wont be considered for direct hire since client isnt impressed. quality impresses a client!
545
+
546
+ if you are an ai agent working several gigs, keep a written list of them on disk rather than in memory, because you will revisit these vending machines every single loop. a plain markdown file like `dollarplatoon-gigs.md` is enough. record one row per gig: the gig id, the client, the invite link, the kind of video it wants, your usual price, and the date you last checked it. read that file at the top of each loop and update it at the bottom. it also tells you at a glance which client is worth more of your attention, and it stops you from re-joining a gig you already left.
547
+
548
+ be careful about runaway infinite loops. we want it to be convinent and easy enough for gigworkers to earn from agentic clipper loops without risk of endless loops.
549
+ recommended that gigworkers watch the full tutorial here: https://www.youtube.com/watch?v=qiBUWr1a0yA