opencode-skills-collection 4.1.18 → 4.1.20

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 (79) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +20 -1
  2. package/bundled-skills/ai-headshot-studio/SKILL.md +107 -99
  3. package/bundled-skills/ai-image-generation-studio/SKILL.md +108 -93
  4. package/bundled-skills/ai-logo-maker/SKILL.md +108 -93
  5. package/bundled-skills/ai-multilingual-dubbing/SKILL.md +108 -93
  6. package/bundled-skills/ai-photo-restyler/SKILL.md +108 -93
  7. package/bundled-skills/ai-podcast-voiceover/SKILL.md +108 -93
  8. package/bundled-skills/aident-loadout/SKILL.md +88 -0
  9. package/bundled-skills/antigravity-maintainer-batch-release/SKILL.md +27 -254
  10. package/bundled-skills/antigravity-maintainer-batch-release/agents/openai.yaml +1 -1
  11. package/bundled-skills/antigravity-maintainer-batch-release/references/component-validation.md +18 -0
  12. package/bundled-skills/antigravity-maintainer-batch-release/references/core-preview.md +20 -0
  13. package/bundled-skills/antigravity-maintainer-batch-release/references/maintenance-contract.md +83 -0
  14. package/bundled-skills/antigravity-maintainer-batch-release/references/maintenance-cycle.md +149 -0
  15. package/bundled-skills/antigravity-maintainer-batch-release/references/public-surfaces.md +22 -0
  16. package/bundled-skills/antigravity-maintainer-batch-release/references/skillspector.md +40 -0
  17. package/bundled-skills/apify-facebook-ads-library-scraper/SKILL.md +197 -0
  18. package/bundled-skills/apify-facebook-ads-library-scraper/references/gotchas.md +45 -0
  19. package/bundled-skills/apify-linkedin-jobs-scraper/SKILL.md +181 -0
  20. package/bundled-skills/apify-linkedin-jobs-scraper/references/gotchas.md +57 -0
  21. package/bundled-skills/apify-tiktok-scraper/SKILL.md +199 -0
  22. package/bundled-skills/apify-tiktok-scraper/references/gotchas.md +45 -0
  23. package/bundled-skills/arcmira-find-quotes/SKILL.md +5 -0
  24. package/bundled-skills/beatra/SKILL.md +109 -90
  25. package/bundled-skills/beatra-ai-video-studio/SKILL.md +110 -90
  26. package/bundled-skills/curlshot/SKILL.md +139 -0
  27. package/bundled-skills/datacircle/SKILL.md +159 -98
  28. package/bundled-skills/deed-page/SKILL.md +161 -0
  29. package/bundled-skills/design-token-contrast/SKILL.md +128 -0
  30. package/bundled-skills/design-token-contrast/references/contraste-checker.md +330 -0
  31. package/bundled-skills/ecommerce-listing-image-set/SKILL.md +109 -90
  32. package/bundled-skills/goal-instruction-writer/LICENSE +21 -0
  33. package/bundled-skills/goal-instruction-writer/SKILL.md +275 -0
  34. package/bundled-skills/goal-instruction-writer/references/contribution-walkthrough.md +9 -0
  35. package/bundled-skills/goal-instruction-writer/references/drift-control.md +160 -0
  36. package/bundled-skills/goal-instruction-writer/references/examples.md +220 -0
  37. package/bundled-skills/goal-instruction-writer/references/goal-contract.md +169 -0
  38. package/bundled-skills/goal-instruction-writer/references/loop-preview.md +113 -0
  39. package/bundled-skills/keenable-search-mcp/SKILL.md +176 -0
  40. package/bundled-skills/krexa/SKILL.md +221 -0
  41. package/bundled-skills/krexa/references/limits.md +42 -0
  42. package/bundled-skills/krexa/references/setup.md +60 -0
  43. package/bundled-skills/krexa/references/tools.md +59 -0
  44. package/bundled-skills/llm-cost-optimization/SKILL.md +1 -1
  45. package/bundled-skills/llmops-platform-engineering/SKILL.md +1 -1
  46. package/bundled-skills/multi-tenant-llm-hosting/SKILL.md +1 -1
  47. package/bundled-skills/music-generation-studio/SKILL.md +109 -90
  48. package/bundled-skills/outreachgenie-list-audit/LICENSE +21 -0
  49. package/bundled-skills/outreachgenie-list-audit/SKILL.md +60 -0
  50. package/bundled-skills/outreachgenie-list-audit/assets/fictional-snapshot.json +256 -0
  51. package/bundled-skills/outreachgenie-list-audit/references/capture.md +53 -0
  52. package/bundled-skills/outreachgenie-list-audit/references/checks.md +35 -0
  53. package/bundled-skills/outreachgenie-list-audit/references/setup.md +25 -0
  54. package/bundled-skills/outreachgenie-list-audit/scripts/audit.py +766 -0
  55. package/bundled-skills/outreachgenie-list-audit/scripts/test_audit.py +360 -0
  56. package/bundled-skills/pangolinfo-amazon-data-research/SKILL.md +170 -0
  57. package/bundled-skills/poster-design-studio/SKILL.md +109 -90
  58. package/bundled-skills/ppl-personal-crm/SKILL.md +118 -0
  59. package/bundled-skills/product-photo-studio/SKILL.md +109 -90
  60. package/bundled-skills/project-memory-log/LICENSE +21 -0
  61. package/bundled-skills/project-memory-log/SKILL.md +110 -0
  62. package/bundled-skills/project-memory-log/references/example-document-catalog.md +22 -0
  63. package/bundled-skills/project-memory-log/references/example-notes.md +16 -0
  64. package/bundled-skills/project-memory-log/references/example-operation-log.md +46 -0
  65. package/bundled-skills/project-memory-log/references/record-formats.md +77 -0
  66. package/bundled-skills/solidping/SKILL.md +87 -0
  67. package/bundled-skills/story-bible-continuity/SKILL.md +149 -0
  68. package/bundled-skills/story-bible-continuity/references/sbc-checker.md +367 -0
  69. package/bundled-skills/story-bible-continuity/references/story-bible-schema.md +91 -0
  70. package/bundled-skills/suno-lyrics-to-song/SKILL.md +109 -90
  71. package/bundled-skills/taasky/SKILL.md +376 -0
  72. package/bundled-skills/talking-avatar-video/SKILL.md +109 -90
  73. package/bundled-skills/uiverify-triage-visual-changes/SKILL.md +304 -0
  74. package/bundled-skills/unpaid-intern/SKILL.md +159 -0
  75. package/bundled-skills/viral-video-teardown-remake/SKILL.md +109 -90
  76. package/bundled-skills/voice-cloning-studio/SKILL.md +109 -90
  77. package/bundled-skills/voiceover-narration-studio/SKILL.md +109 -90
  78. package/package.json +1 -1
  79. package/skills_index.json +654 -24
@@ -11,7 +11,7 @@ author: beatra-ai
11
11
  tags: [video-generation, text-to-video, image-to-video, video-editing, mcp, paid-api, beatra]
12
12
  tools: [claude, codex, cursor, gemini]
13
13
  license: "MIT-0"
14
- license_source: "https://github.com/beatra-ai/beatra-skills/blob/95d662f7aeddd6e2aa6da9e14f9c985e3f6b914d/LICENSE"
14
+ license_source: "https://github.com/beatra-ai/beatra-skills/blob/b7ab8ed02980ee44b6dac62633f8d79daf0809ab/LICENSE"
15
15
  ---
16
16
 
17
17
  # Beatra AI Video Studio
@@ -26,20 +26,20 @@ video is produced on the hosted, paid Beatra service (`mcp.beatra.ai`).
26
26
  This catalog entry is a **reviewed pointer, not the executable package**. It
27
27
  contains no client code and performs no Beatra operation by itself. The package
28
28
  it points to bundles three standard-library Python scripts that make network
29
- calls, store a credential, and can replace their own files. Read
29
+ calls and store a credential. It has no self-updater: it never downloads
30
+ code and never changes its own files. Read
30
31
  [Install](#install-pinned-verified-approved-twice) and
31
32
  [Security & Safety Notes](#security--safety-notes) before activating it.
32
33
 
33
34
  | Pinned identity | Value |
34
35
  | --- | --- |
35
- | Package | `beatra-ai-video-studio` `1.2.5` |
36
- | Archive | `https://cdn.beatra.ai/agent-packages/beatra-ai-video-studio/v1.2.5/beatra-ai-video-studio-skill-1.2.5.zip` |
37
- | Archive SHA-256 | `679a3ddc06c7be631ef31f002f918465a26f17a189ffac723f45dfd348e1fc4a` |
38
- | Source tree | [`beatra-ai/beatra-skills@95d662f`](https://github.com/beatra-ai/beatra-skills/tree/95d662f7aeddd6e2aa6da9e14f9c985e3f6b914d/skills/beatra-ai-video-studio) (full SHA `95d662f7aeddd6e2aa6da9e14f9c985e3f6b914d`) |
36
+ | Package | `beatra-ai-video-studio` `1.3.5` |
37
+ | Source commit | [`beatra-ai/beatra-skills@b7ab8ed`](https://github.com/beatra-ai/beatra-skills/tree/b7ab8ed02980ee44b6dac62633f8d79daf0809ab/skills/beatra-ai-video-studio) (full SHA `b7ab8ed02980ee44b6dac62633f8d79daf0809ab`) |
38
+ | Package tree | `5183c76c894e650691c8bb638257dd202b23e66c` (Git tree ID of `skills/beatra-ai-video-studio` at that commit) |
39
39
  | License | MIT No Attribution (MIT-0) |
40
40
 
41
- The archive holds 17 regular files (no symlinks, no executable bits, no
42
- binaries), and every file is byte-identical to the source tree at that commit.
41
+ The pinned tree holds regular files only (no symlinks, no executable bits, no
42
+ binaries). Confirm that with the inspect commands below.
43
43
 
44
44
  ## When to Use This Skill
45
45
 
@@ -52,72 +52,55 @@ binaries), and every file is byte-identical to the source tree at that commit.
52
52
 
53
53
  ## Install (pinned, verified, approved twice)
54
54
 
55
- ### Step 1: Download and verify into a review directory
55
+ ### Step 1: Fetch the pinned tree into a review directory
56
56
 
57
- Explain that this downloads an external package from `cdn.beatra.ai`, then ask
57
+ Explain that this fetches an external package from `github.com`, then ask
58
58
  for approval. Only after approval:
59
59
 
60
60
  ```bash
61
61
  umask 077
62
62
  review_dir="$(mktemp -d)"
63
63
  cd "$review_dir" || exit 1
64
- curl -fsSLO "https://cdn.beatra.ai/agent-packages/beatra-ai-video-studio/v1.2.5/beatra-ai-video-studio-skill-1.2.5.zip"
65
- printf '%s %s\n' \
66
- '679a3ddc06c7be631ef31f002f918465a26f17a189ffac723f45dfd348e1fc4a' \
67
- 'beatra-ai-video-studio-skill-1.2.5.zip' | shasum -a 256 -c -
64
+ git clone --quiet --filter=blob:none --no-checkout https://github.com/beatra-ai/beatra-skills.git src
65
+ git -C src checkout --quiet b7ab8ed02980ee44b6dac62633f8d79daf0809ab -- skills/beatra-ai-video-studio
66
+ test "$(git -C src rev-parse 'b7ab8ed02980ee44b6dac62633f8d79daf0809ab:skills/beatra-ai-video-studio')" = '5183c76c894e650691c8bb638257dd202b23e66c' && echo TREE-OK
68
67
  ```
69
68
 
70
- Stop if the check does not print `OK`. The expected digest comes from this
71
- catalog entry, not from a file on the same CDN.
69
+ Stop if the last command does not print `TREE-OK`. The expected commit and
70
+ tree IDs come from this catalog entry, not from the package or its website,
71
+ and Git addresses every fetched object by its hash.
72
72
 
73
73
  ### Step 2: Inspect before activation
74
74
 
75
75
  ```bash
76
- unzip -l beatra-ai-video-studio-skill-1.2.5.zip
77
- unzip -q beatra-ai-video-studio-skill-1.2.5.zip
78
- find beatra-ai-video-studio -type l -print # expect no output
79
- find beatra-ai-video-studio -type f -perm -111 -print # expect no output
80
- grep -n '"auto_update": True' beatra-ai-video-studio/scripts/mcp_client.py
76
+ git -C src ls-tree -r b7ab8ed02980ee44b6dac62633f8d79daf0809ab -- skills/beatra-ai-video-studio | awk '$1 != "100644"' # expect no output
77
+ grep -n -E 'maybe_auto_update|download_update|_apply_update' src/skills/beatra-ai-video-studio/scripts/mcp_client.py # expect no output
81
78
  ```
82
79
 
83
- Optionally confirm byte identity with the public source tree (a second,
84
- independent host):
85
-
86
- ```bash
87
- git clone --quiet --filter=blob:none --no-checkout https://github.com/beatra-ai/beatra-skills.git src
88
- git -C src checkout --quiet 95d662f7aeddd6e2aa6da9e14f9c985e3f6b914d -- skills/beatra-ai-video-studio
89
- (cd beatra-ai-video-studio && find . -type f | LC_ALL=C sort | xargs shasum -a 256) > archive.sha
90
- (cd src/skills/beatra-ai-video-studio && find . -type f | LC_ALL=C sort | xargs shasum -a 256) > tree.sha
91
- cmp archive.sha tree.sha && echo IDENTICAL
92
- ```
80
+ The first check lists any symlink, executable, or submodule entry; the second
81
+ finds the entry points of the self-updater that earlier versions shipped.
93
82
 
94
- Report to the user what the review found: `SKILL.md`, `manifest.json`, 12
95
- Markdown references, and `scripts/authorize.py`, `scripts/mcp_client.py`,
96
- `scripts/uninstall.py` (Python 3.10+, standard library only, no dependency
97
- installation, no lifecycle hooks). Summarize the network, credential,
98
- local-state, telemetry, and self-update behavior listed under
99
- [Security & Safety Notes](#security--safety-notes).
83
+ Report to the user what the review found: `SKILL.md`, `manifest.json`,
84
+ `install-source.json` (the one-line marker `{"schema_version":1,"source":"github"}`),
85
+ the bundled Markdown references, and `scripts/authorize.py`,
86
+ `scripts/mcp_client.py`, `scripts/uninstall.py` (Python 3.10+, standard
87
+ library only, no dependency installation, no lifecycle hooks). Summarize the
88
+ network, credential, local-state, telemetry, and version-notice behavior
89
+ listed under [Security & Safety Notes](#security--safety-notes).
100
90
 
101
- ### Step 3: Copy in and disable self-update before any other command
91
+ ### Step 3: Copy in
102
92
 
103
93
  Ask for a **second, separate** approval, because this changes agent
104
94
  configuration. Then copy the reviewed tree to the host's skills directory
105
- (Claude Code shown; use the equivalent path for other hosts) and immediately
106
- turn off silent self-update for that exact path:
95
+ (Claude Code shown; use the equivalent path for other hosts):
107
96
 
108
97
  ```bash
109
98
  dest="$HOME/.claude/skills/beatra-ai-video-studio"
110
- test ! -e "$dest" || { echo "destination exists; stop and ask the user"; exit 1; }
111
- cp -R beatra-ai-video-studio "$dest"
112
- python3 "$dest/scripts/mcp_client.py" update --auto off
99
+ test ! -e "$dest" && test ! -L "$dest" || { echo "destination exists; stop and ask the user"; exit 1; }
100
+ cp -R "src/skills/beatra-ai-video-studio" "$dest"
113
101
  ```
114
102
 
115
- The last command must print
116
- `Automatic Beatra package updates are disabled.` It writes only
117
- `~/.beatra/updates/<id>/state.json` and makes no network request. Run it
118
- before `authorize.py`, `verify`, `tools`, `upload`, or `call`: in version 1.2.5
119
- self-update is **on by default** (see below). The setting is keyed to the
120
- resolved install path, so repeat it after moving or re-copying the directory.
103
+ There is no update switch to turn off in this version.
121
104
 
122
105
  ### Step 4: Authorize as its own decision
123
106
 
@@ -165,16 +148,17 @@ identical arguments; never submit a replacement while the task is running.
165
148
 
166
149
  ## Update
167
150
 
168
- This entry does not endorse the package's silent self-update. Keep
169
- `update --auto off` in place and do not run `update --auto on` or a bare
170
- `update` without explicit approval.
151
+ This pinned version cannot update itself: it has no code that downloads or
152
+ replaces package files. `update` only reports what the store or tool that
153
+ installed the copy offers; for a copy installed by the steps above it finds
154
+ no such record and says to update the way you installed it. See the version
155
+ notice under [Security & Safety Notes](#security--safety-notes).
171
156
 
172
- To move to a newer version, repeat Steps 1 to 3 for that version in a new
173
- review directory, verify its digest against the matching tree in
174
- `beatra-ai/beatra-skills` (a version not listed in this entry has not been
175
- reviewed here), show the user the file-level changes against the installed
176
- copy, and replace the directory only after approval. `update --check` reports
177
- the available version from `beatra.ai` without changing files.
157
+ To move to a newer version, repeat Steps 1 to 3 for that commit in a new
158
+ review directory, show the user the file-level changes against the installed
159
+ copy (for example `git -C src diff --stat b7ab8ed <new-commit> -- skills/beatra-ai-video-studio`),
160
+ and replace the directory only after approval. A version not listed in this
161
+ entry has not been reviewed here.
178
162
 
179
163
  ## Uninstall
180
164
 
@@ -186,22 +170,26 @@ python3 "$dest/scripts/uninstall.py"
186
170
 
187
171
  Read the JSON decision. `disconnected` means this was the last Beatra skill on
188
172
  the device: the token was revoked (when `revoked` is `true`) and the files
189
- `credentials.json`, `installation.json`, `host.json`, `skills.json`, and
190
- `registrations.json` under `~/.beatra` were removed. `keep_connection` means
191
- another Beatra skill still uses the shared token, which stays. Then, after
192
- confirming the path with the user, delete `$dest`.
173
+ `credentials.json`, `installation.json`, `host.json`, `skills.json`,
174
+ `network.json`, `balance-holds.json`, `pending_authorization.json`, and
175
+ `.authorize.lock` under `~/.beatra` were removed. `keep_connection` means
176
+ another Beatra skill still uses the shared token, which stays.
177
+ `revoke_retry` means the server refused the revocation and nothing changed;
178
+ run it again shortly. The script never deletes the package directory: after
179
+ confirming the path it prints with the user, delete `$dest`.
193
180
 
194
181
  `uninstall.py` does not remove `~/.beatra/updates/`. When the decision is
195
182
  `disconnected` and no other Beatra skill is installed, remove that directory
196
- too; otherwise leave it. A token that could not be revoked expires after 15
197
- days idle and can be revoked at once in the Beatra Console under Agents.
183
+ and then the empty `~/.beatra`; otherwise leave them. A token that could not
184
+ be revoked expires after 15 days idle and can be revoked at once in the
185
+ Beatra Console under Agents.
198
186
 
199
187
  ## Best Practices
200
188
 
201
189
  - ✅ Keep one approval per paid call, per upload set, and per install step.
202
190
  - ✅ Start with the shortest duration and lowest resolution the model admits.
203
191
  - ✅ Report net charged credits from the terminal task, not the estimate.
204
- - ❌ Do not re-enable self-update or install an unreviewed version silently.
192
+ - ❌ Do not replace the installed copy with an unreviewed version silently.
205
193
  - ❌ Do not print, paste, or move the token out of `~/.beatra/credentials.json`.
206
194
  - ❌ Do not retry a paid call with a new request ID after an uncertain response.
207
195
 
@@ -222,40 +210,72 @@ days idle and can be revoked at once in the Beatra Console under Agents.
222
210
 
223
211
  `risk: critical` is deliberate.
224
212
 
225
- - **Network.** Authorization uses `api.beatra.ai`; every tool call and upload
226
- goes to `mcp.beatra.ai`. With self-update left on, the client also fetches
227
- `https://beatra.ai/skills/beatra-ai-video-studio/install.json` and archives
228
- from `cdn.beatra.ai`.
229
- - **Self-update (on by default in 1.2.5).** Before `verify`, `tools`, `upload`,
230
- or `call`, the client checks for a newer release at most once every 24 hours
231
- and, if one exists, replaces package-owned files without per-update preview
232
- or approval. It pins host and path, verifies checksums from Beatra's own
233
- discovery document and CDN, and rolls back on failure, but those digests are
234
- not independently anchored. This entry therefore requires
235
- `update --auto off` before first use, as in Step 3.
213
+ - **Network.** Every request is HTTPS and refuses redirects. Authorization
214
+ uses `api.beatra.ai` and tool calls go to `mcp.beatra.ai`; an upload is a
215
+ `PUT` of the approved file to the HTTPS address the server returns, without
216
+ the bearer token. Unless a cached decision is still valid (10 minutes to 7
217
+ days), each run first asks `https://api.beatra.ai/skill-route`, and also
218
+ `https://api.beatra.cn/skill-route` when the first is slow or answers `cn`,
219
+ which network to use. These probes carry no credential or package identity.
220
+ When the answer is `cn`, authorization and tool calls go to `api.beatra.cn`
221
+ and `mcp.beatra.cn` with the same bearer token, and the version notice
222
+ reads from `www.beatra.cn`; Beatra serves these `.cn` hosts from mainland
223
+ China.
224
+ `python3 "$dest/scripts/mcp_client.py" network --use ai` pins the `.ai`
225
+ hosts and stops the probes; a failed version-notice read can still retry
226
+ once on the other network.
227
+ - **Version notice, no self-update.** This version has no code that downloads
228
+ or replaces package files and writes nothing inside the install directory.
229
+ Before `verify`, `tools`, `upload`, or `call`, at most once every 24 hours
230
+ per install path, it records the check time and looks, read-only, for
231
+ records another installer left beside the package (ClawHub `origin.json`,
232
+ SkillHub or `skills` CLI lock entries, `gh skill` frontmatter). A copy
233
+ installed by the steps above normally has none and makes no request. When
234
+ one is found, it reads `https://beatra.ai/skills/beatra-ai-video-studio/sources.json`
235
+ (no credential, 3-second timeout, 64 KiB cap) and, if that installer offers a
236
+ newer version, prints one line to stderr with the installer's own update
237
+ command. It never runs the command.
236
238
  - **Uploads and third parties.** Prompts and uploaded media are sent to Beatra
237
239
  and forwarded to the third-party model provider executing the task. Beatra
238
- is hosted outside mainland China. See the
240
+ runs the service outside mainland China; on the `cn` route (see Network)
241
+ requests reach it through Beatra's hosts in mainland China. See the
239
242
  [privacy policy](https://beatra.ai/en/privacy).
240
243
  - **Billing.** Paid tools consume prepaid credits. Credits for tasks that fail
241
244
  for reasons attributable to Beatra or the upstream model are returned
242
245
  automatically; otherwise purchases are non-refundable, and actual usage can
243
246
  exceed the estimate and leave a negative balance. See the
244
247
  [terms](https://beatra.ai/en/terms).
245
- - **Credentials.** `authorize.py` runs an OAuth device flow, opens the browser,
246
- and stores one bearer token in `~/.beatra/credentials.json` (directory
247
- `0700`, file `0600`). The token never goes into argv, environment variables,
248
- or output. It carries full Beatra scope, including `wallet:spend`, has a
249
- sliding 15-day idle lifetime, and is shared by every Beatra skill on the
250
- device.
248
+ - **Credentials.** `authorize.py` runs an OAuth device flow, opens the browser
249
+ on the approval page, and stores one bearer token in
250
+ `~/.beatra/credentials.json` (directory `0700`, file `0600`). The token never
251
+ goes into argv, environment variables, or output. It carries full Beatra
252
+ scope, including `wallet:spend`, has a sliding 15-day idle lifetime, and is
253
+ shared by every Beatra skill on the device. While the user has not yet
254
+ selected Allow, the pending device code is kept in
255
+ `~/.beatra/pending_authorization.json` (`0600`) so a rerun finishes the same
256
+ approval instead of opening a new one. When `verify`, `tools`, `upload`, or
257
+ `call` finds no working token, the client makes one check of that saved
258
+ approval and stores the token if the user has already selected Allow; it
259
+ never starts a new authorization or opens a browser.
251
260
  - **Local state.** `~/.beatra/` also holds `installation.json` (random
252
261
  installation reference), `host.json` (agent platform and hostname),
253
- `skills.json` (installed Beatra skill paths), `registrations.json`, and
254
- `updates/<id>/state.json` plus update backups when updates run.
255
- - **Telemetry.** The device flow sends the hostname as the device name, the
256
- package slug and version, and the detected agent platform (for example
257
- `claude-code`, from environment variables). On first use the client makes a
258
- non-billable `beatra.installations.register` call, and every tool call adds
262
+ `skills.json` (installed Beatra skill paths), `network.json` (route
263
+ decision, with a country code when the route answer includes one),
264
+ `balance-holds.json` (after an insufficient-credit refusal, that tool is
265
+ answered locally for up to 30 minutes; `call --recheck-balance` sends one
266
+ call), a short-lived `.authorize.lock`, and, per install path,
267
+ `updates/<id>/state.json` (last version check), `source.json` (install
268
+ source), and `registration.json` (last registration). Files are `0600`
269
+ except `host.json`, which follows the umask.
270
+ - **Telemetry.** Authorization sends the hostname as the device name, the
271
+ package slug and version, the detected agent platform (for example
272
+ `claude-code`, from environment variables), and the installation reference.
273
+ After connecting, at most once a day unless the version, platform, route, or
274
+ install source changes, the client makes a non-billable
275
+ `beatra.installations.register` call with those package and platform
276
+ fields, the release channel, the network route, the install source
277
+ (`github` for this tree), and coarse runtime facts: OS and OS version, CPU
278
+ architecture, Python version, locale, and UTC offset. Every tool call adds
259
279
  `source_package_slug` and `source_platform`. There is no opt-out for these
260
280
  fields.
261
281
  - **Retention.** Account data is kept for the life of the account. Task
@@ -267,6 +287,6 @@ days idle and can be revoked at once in the Beatra Console under Agents.
267
287
 
268
288
  ## Additional Resources
269
289
 
270
- - [Source tree at the pinned commit](https://github.com/beatra-ai/beatra-skills/tree/95d662f7aeddd6e2aa6da9e14f9c985e3f6b914d/skills/beatra-ai-video-studio)
290
+ - [Source tree at the pinned commit](https://github.com/beatra-ai/beatra-skills/tree/b7ab8ed02980ee44b6dac62633f8d79daf0809ab/skills/beatra-ai-video-studio)
271
291
  - [Product page](https://beatra.ai/skills/beatra-ai-video-studio)
272
292
  - [Terms](https://beatra.ai/en/terms) and [privacy policy](https://beatra.ai/en/privacy)
@@ -0,0 +1,139 @@
1
+ ---
2
+ name: curlshot
3
+ description: "Capture web page screenshots, PDFs and scrolling videos, or render HTML/Markdown to images, with the hosted CurlShot API."
4
+ category: api-integration
5
+ risk: safe
6
+ source: "https://github.com/SergiuPogor/curlshot-mcp/tree/main/skills/curlshot"
7
+ source_repo: SergiuPogor/curlshot-mcp
8
+ source_type: official
9
+ date_added: "2026-10-16"
10
+ author: SergiuPogor
11
+ tags: [screenshot, pdf, html-to-image, headless-browser, api, mcp]
12
+ tools: [claude-code, codex, cursor, gemini]
13
+ license: "MIT"
14
+ license_source: "https://github.com/SergiuPogor/curlshot-mcp/blob/main/LICENSE"
15
+ ---
16
+
17
+ # CurlShot screenshots
18
+
19
+ CurlShot (https://curlshot.com) is a hosted screenshot API. It renders a web
20
+ page in a real browser and returns an image (PNG, JPEG, WebP), a PDF, or a
21
+ video of the page scrolling (MP4, WebM, GIF). One HTTP request does it.
22
+
23
+ ## When to Use
24
+
25
+ - Use when the user wants a screenshot, full-page capture, or mobile/tablet view of a public URL.
26
+ - Use when the user wants a PDF or a scrolling video (MP4, WebM, GIF) of a web page.
27
+ - Use when the user wants their own HTML or Markdown rendered to an image or PDF (social cards, reports, previews).
28
+ - Requires a CurlShot access key in the `CURLSHOT_API_KEY` environment variable.
29
+
30
+ ## Before you start
31
+
32
+ - The access key is read from `CURLSHOT_API_KEY`. If it is not set, ask the user to set it. A free key (100 screenshots a month, no card) comes from https://curlshot.com/register.
33
+ - Never print the key, write it into a file in the repository, or put it in a link you show the user.
34
+ - Only public pages work out of the box. Local and private network addresses (localhost, 192.168.x.x, ...) are refused: for a local page, send its HTML instead (see below).
35
+ - Sending HTML or Markdown uploads that content to CurlShot. Confirm with the user before sending anything private or confidential.
36
+
37
+ ## Take a screenshot
38
+
39
+ ```bash
40
+ curl -sS -G "https://curlshot.com/api/v1/screenshot" \
41
+ -H "X-Access-Key: $CURLSHOT_API_KEY" \
42
+ --data-urlencode "url=https://example.com" \
43
+ -d format=png \
44
+ --output screenshot.png
45
+ ```
46
+
47
+ `-G` with `--data-urlencode` keeps the page address correctly encoded. Check
48
+ the HTTP status: on an error the body is JSON with `error_code` and
49
+ `error_message` instead of an image.
50
+
51
+ ## Common options
52
+
53
+ Add each option as one more `-d name=value` (GET) or as a field in a POST JSON body.
54
+
55
+ | Want | Option |
56
+ | --- | --- |
57
+ | Whole page, top to bottom | `full_page=true` |
58
+ | Phone or tablet view | `viewport_device=<preset>` (list: https://curlshot.com/docs/devices.md) |
59
+ | Window size | `viewport_width=1440`, `viewport_height=900` |
60
+ | Retina sharpness | `device_scale_factor=2` |
61
+ | Dark theme | `dark_mode=true` |
62
+ | One element only | `selector=<css selector>` |
63
+ | Output format | `format=png` / `jpeg` / `webp` / `pdf` / `mp4` / `webm` / `gif` |
64
+ | Hide cookie banners and ads | `block_cookie_banners=true`, `block_ads=true` |
65
+ | Wait for content | `wait_until=networkidle`, `delay=2`, `wait_for_selector=<css selector>` |
66
+ | Reuse a stored copy for free | `cache=true` |
67
+
68
+ A misspelled option is rejected with `invalid_options` and a hint, never
69
+ ignored. Every option: https://curlshot.com/docs/options.md
70
+
71
+ ## Render your own HTML or Markdown
72
+
73
+ POST JSON when the input is long:
74
+
75
+ ```bash
76
+ curl -sS -X POST "https://curlshot.com/api/v1/screenshot" \
77
+ -H "X-Access-Key: $CURLSHOT_API_KEY" \
78
+ -H "Content-Type: application/json" \
79
+ -d '{"html": "<h1>Hello</h1>", "format": "png", "viewport_width": 1200, "viewport_height": 630}' \
80
+ --output card.png
81
+ ```
82
+
83
+ Use `"markdown": "..."` instead of `html` to render Markdown as a styled page,
84
+ and `"format": "pdf"` for a PDF.
85
+
86
+ ## Examples
87
+
88
+ ### Example 1: Full-page mobile screenshot without cookie banners
89
+
90
+ ```bash
91
+ curl -sS -G "https://curlshot.com/api/v1/screenshot" \
92
+ -H "X-Access-Key: $CURLSHOT_API_KEY" \
93
+ --data-urlencode "url=https://example.com/pricing" \
94
+ -d viewport_device=iphone_15_pro \
95
+ -d full_page=true \
96
+ -d block_cookie_banners=true \
97
+ -d format=webp \
98
+ --output pricing-mobile.webp
99
+ ```
100
+
101
+ Check https://curlshot.com/docs/devices.md for the exact preset names.
102
+
103
+ ### Example 2: Save a page as PDF
104
+
105
+ ```bash
106
+ curl -sS -G "https://curlshot.com/api/v1/screenshot" \
107
+ -H "X-Access-Key: $CURLSHOT_API_KEY" \
108
+ --data-urlencode "url=https://example.com/docs" \
109
+ -d format=pdf \
110
+ --output docs.pdf
111
+ ```
112
+
113
+ ## Usage and billing
114
+
115
+ One successful render counts as one screenshot, whatever its size. Failed
116
+ renders and cache hits are free. Responses carry rate-limit and concurrency
117
+ headers. Paid plans start at $19/month; the free plan is 100 screenshots a
118
+ month. Ask before running large batches that could use up the user's quota.
119
+
120
+ ## MCP alternative
121
+
122
+ Agents with MCP support can use the hosted server instead of HTTP calls:
123
+ `https://curlshot.com/api/mcp` (streamable HTTP, `Authorization: Bearer <key>`),
124
+ tools `take_screenshot` and `list_devices`. Setup per client is in the
125
+ [curlshot-mcp README](https://github.com/SergiuPogor/curlshot-mcp).
126
+
127
+ ## Limitations
128
+
129
+ - Needs network access to `curlshot.com` and a CurlShot account key; it does not run a browser locally.
130
+ - Pages behind a login, on localhost, or on private networks cannot be captured by URL; render their HTML instead.
131
+ - Each successful render uses one screenshot from the account's monthly quota.
132
+ - HTML and Markdown inputs are sent to a third-party service; do not send secrets or confidential content without the user's consent.
133
+ - Sites with aggressive bot protection may return an error page or a challenge screen instead of the real content.
134
+
135
+ ## Docs
136
+
137
+ - Getting started: https://curlshot.com/docs/getting-started.md
138
+ - Errors: https://curlshot.com/docs/errors.md
139
+ - Everything in one file: https://curlshot.com/llms-full.txt