opencode-skills-collection 3.0.32 → 3.0.34
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/bundled-skills/.antigravity-install-manifest.json +10 -1
- package/bundled-skills/bilig-workpaper/SKILL.md +12 -3
- package/bundled-skills/bumblebee/SKILL.md +6 -2
- package/bundled-skills/bun-development/SKILL.md +5 -3
- package/bundled-skills/cloud-penetration-testing/SKILL.md +5 -3
- package/bundled-skills/container-security-hardening/SKILL.md +20 -7
- package/bundled-skills/container-security-hardening/references/kubernetes-pod-security.md +8 -2
- package/bundled-skills/doc2math/SKILL.md +102 -0
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/getting-started.md +6 -2
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +4 -4
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/environment-setup-guide/SKILL.md +10 -6
- package/bundled-skills/evolution/SKILL.md +5 -3
- package/bundled-skills/github-actions-advanced/SKILL.md +34 -9
- package/bundled-skills/gitops-workflow/SKILL.md +5 -3
- package/bundled-skills/ii-commons/SKILL.md +15 -1
- package/bundled-skills/lemmaly/SKILL.md +15 -6
- package/bundled-skills/linkerd-patterns/SKILL.md +5 -3
- package/bundled-skills/longbridge/SKILL.md +5 -1
- package/bundled-skills/mercury-mcp/SKILL.md +9 -1
- package/bundled-skills/moatmri/SKILL.md +84 -0
- package/bundled-skills/nextjs-seo-indexing/SKILL.md +263 -0
- package/bundled-skills/openclaw-github-repo-commander/scripts/repo-audit.sh +42 -0
- package/bundled-skills/photopea-embedded-editor/SKILL.md +7 -3
- package/bundled-skills/schema-markup-generator/SKILL.md +319 -0
- package/bundled-skills/sendblue/sendblue-api/SKILL.md +6 -1
- package/bundled-skills/sendblue/sendblue-cli/SKILL.md +6 -1
- package/bundled-skills/sendblue/sendblue-notify/SKILL.md +6 -1
- package/bundled-skills/sendblue/textme/SKILL.md +4 -0
- package/bundled-skills/social-metadata-hardening/SKILL.md +230 -0
- package/bundled-skills/socialclaw/SKILL.md +6 -1
- package/bundled-skills/uv-package-manager/resources/implementation-playbook.md +5 -3
- package/bundled-skills/varlock/SKILL.md +10 -6
- package/bundled-skills/vibe-code-cleanup/SKILL.md +231 -0
- package/bundled-skills/vibecode-production-qa-validator/SKILL.md +237 -0
- package/bundled-skills/wordpress-centric-high-seo-optimized-blogwriting-skill/SKILL.md +229 -162
- package/bundled-skills/yield-intelligence/SKILL.md +121 -0
- package/bundled-skills/youtube-full/SKILL.md +144 -0
- package/package.json +1 -1
- package/skills_index.json +199 -1
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: schema-markup-generator
|
|
3
|
+
description: "Generate and implement JSON-LD structured data for web apps, tool pages, blogs, FAQs, and SaaS sites. Supports WebSite, SoftwareApplication, BlogPosting, FAQPage, HowTo, BreadcrumbList, and Organization schemas."
|
|
4
|
+
category: seo
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
date_added: "2026-05-31"
|
|
9
|
+
author: Whoisabhishekadhikari
|
|
10
|
+
tags: [seo, schema, json-ld, structured-data, rich-results, nextjs, technical-seo]
|
|
11
|
+
tools: [claude, cursor, gemini, claude-code]
|
|
12
|
+
version: 1.0.0
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Schema Markup Generator Skill
|
|
16
|
+
|
|
17
|
+
Add JSON-LD structured data to pages to unlock rich results, improve CTR, and signal context to Google and AI systems.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## When to Use
|
|
22
|
+
|
|
23
|
+
- Use when adding or auditing JSON-LD schema for websites, SaaS apps, tools, articles, FAQs, breadcrumbs, or organization pages.
|
|
24
|
+
- Use when schema must be implemented in Next.js App Router or validated against Google Rich Results and Schema.org tooling.
|
|
25
|
+
- Use when a page has strong content but lacks structured data for search engines and rich-result eligibility.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## How to Add Schema in Next.js App Router
|
|
30
|
+
|
|
31
|
+
The cleanest approach is a reusable `JsonLd` component:
|
|
32
|
+
|
|
33
|
+
```jsx
|
|
34
|
+
// components/JsonLd.jsx
|
|
35
|
+
export function JsonLd({ data }) {
|
|
36
|
+
return (
|
|
37
|
+
<script
|
|
38
|
+
type="application/ld+json"
|
|
39
|
+
dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}
|
|
40
|
+
/>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Use it in any page:
|
|
46
|
+
```jsx
|
|
47
|
+
import { JsonLd } from '@/components/JsonLd';
|
|
48
|
+
|
|
49
|
+
export default function MyPage() {
|
|
50
|
+
return (
|
|
51
|
+
<>
|
|
52
|
+
<JsonLd data={mySchemaObject} />
|
|
53
|
+
{/* rest of page */}
|
|
54
|
+
</>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Schema Types by Page Type
|
|
62
|
+
|
|
63
|
+
### WebSite + Sitelinks Searchbox (homepage only)
|
|
64
|
+
```js
|
|
65
|
+
{
|
|
66
|
+
"@context": "https://schema.org",
|
|
67
|
+
"@type": "WebSite",
|
|
68
|
+
"name": "100 SEO Tools",
|
|
69
|
+
"url": "https://www.100seotools.com",
|
|
70
|
+
"description": "Free online SEO tools for keyword research, technical audits, and more.",
|
|
71
|
+
"potentialAction": {
|
|
72
|
+
"@type": "SearchAction",
|
|
73
|
+
"target": {
|
|
74
|
+
"@type": "EntryPoint",
|
|
75
|
+
"urlTemplate": "https://www.100seotools.com/search?q={search_term_string}"
|
|
76
|
+
},
|
|
77
|
+
"query-input": "required name=search_term_string"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
### SoftwareApplication (tool / SaaS app pages)
|
|
85
|
+
```js
|
|
86
|
+
{
|
|
87
|
+
"@context": "https://schema.org",
|
|
88
|
+
"@type": "SoftwareApplication",
|
|
89
|
+
"name": "Keyword Density Checker",
|
|
90
|
+
"applicationCategory": "WebApplication",
|
|
91
|
+
"operatingSystem": "Web",
|
|
92
|
+
"url": "https://www.100seotools.com/tools/keyword-density-checker",
|
|
93
|
+
"description": "Free keyword density checker tool. Analyze keyword frequency and optimize your content for SEO.",
|
|
94
|
+
"offers": {
|
|
95
|
+
"@type": "Offer",
|
|
96
|
+
"price": "0",
|
|
97
|
+
"priceCurrency": "USD"
|
|
98
|
+
},
|
|
99
|
+
"featureList": [
|
|
100
|
+
"Analyze keyword frequency",
|
|
101
|
+
"Detect over-optimization",
|
|
102
|
+
"Export results as CSV"
|
|
103
|
+
],
|
|
104
|
+
"provider": {
|
|
105
|
+
"@type": "Organization",
|
|
106
|
+
"name": "100 SEO Tools",
|
|
107
|
+
"url": "https://www.100seotools.com"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
### Article / BlogPosting (blog posts)
|
|
115
|
+
```js
|
|
116
|
+
{
|
|
117
|
+
"@context": "https://schema.org",
|
|
118
|
+
"@type": "BlogPosting",
|
|
119
|
+
"headline": "How to Improve Your Core Web Vitals in 2025",
|
|
120
|
+
"description": "A practical guide to improving LCP, FID, and CLS scores for better rankings.",
|
|
121
|
+
"url": "https://www.100seotools.com/blog/improve-core-web-vitals",
|
|
122
|
+
"datePublished": "2025-01-15",
|
|
123
|
+
"dateModified": "2025-03-20",
|
|
124
|
+
"author": {
|
|
125
|
+
"@type": "Person",
|
|
126
|
+
"name": "Jane Smith",
|
|
127
|
+
"url": "https://www.100seotools.com/author/jane-smith"
|
|
128
|
+
},
|
|
129
|
+
"publisher": {
|
|
130
|
+
"@type": "Organization",
|
|
131
|
+
"name": "100 SEO Tools",
|
|
132
|
+
"logo": {
|
|
133
|
+
"@type": "ImageObject",
|
|
134
|
+
"url": "https://www.100seotools.com/logo.png"
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"image": {
|
|
138
|
+
"@type": "ImageObject",
|
|
139
|
+
"url": "https://www.100seotools.com/images/blog/core-web-vitals.jpg",
|
|
140
|
+
"width": 1200,
|
|
141
|
+
"height": 630
|
|
142
|
+
},
|
|
143
|
+
"mainEntityOfPage": {
|
|
144
|
+
"@type": "WebPage",
|
|
145
|
+
"@id": "https://www.100seotools.com/blog/improve-core-web-vitals"
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
### FAQPage (FAQ sections, tool help pages)
|
|
153
|
+
```js
|
|
154
|
+
{
|
|
155
|
+
"@context": "https://schema.org",
|
|
156
|
+
"@type": "FAQPage",
|
|
157
|
+
"mainEntity": [
|
|
158
|
+
{
|
|
159
|
+
"@type": "Question",
|
|
160
|
+
"name": "What is keyword density?",
|
|
161
|
+
"acceptedAnswer": {
|
|
162
|
+
"@type": "Answer",
|
|
163
|
+
"text": "Keyword density is the percentage of times a keyword appears in a piece of content relative to the total word count. A healthy keyword density is typically 1-3%."
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"@type": "Question",
|
|
168
|
+
"name": "Is this tool free to use?",
|
|
169
|
+
"acceptedAnswer": {
|
|
170
|
+
"@type": "Answer",
|
|
171
|
+
"text": "Yes, our keyword density checker is completely free with no registration required."
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
]
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
### HowTo (step-by-step tool guides)
|
|
181
|
+
```js
|
|
182
|
+
{
|
|
183
|
+
"@context": "https://schema.org",
|
|
184
|
+
"@type": "HowTo",
|
|
185
|
+
"name": "How to Check Keyword Density",
|
|
186
|
+
"description": "Step-by-step guide to analyzing keyword density using our free tool.",
|
|
187
|
+
"totalTime": "PT2M",
|
|
188
|
+
"step": [
|
|
189
|
+
{
|
|
190
|
+
"@type": "HowToStep",
|
|
191
|
+
"position": 1,
|
|
192
|
+
"name": "Paste your content",
|
|
193
|
+
"text": "Copy your article or webpage content and paste it into the text area.",
|
|
194
|
+
"image": "https://www.100seotools.com/images/how-to/step1.jpg"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"@type": "HowToStep",
|
|
198
|
+
"position": 2,
|
|
199
|
+
"name": "Enter your target keyword",
|
|
200
|
+
"text": "Type the keyword you want to analyze in the keyword field."
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"@type": "HowToStep",
|
|
204
|
+
"position": 3,
|
|
205
|
+
"name": "Click Analyze",
|
|
206
|
+
"text": "Press the Analyze button to get your keyword density report instantly."
|
|
207
|
+
}
|
|
208
|
+
]
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
### BreadcrumbList (all non-homepage pages)
|
|
215
|
+
```js
|
|
216
|
+
{
|
|
217
|
+
"@context": "https://schema.org",
|
|
218
|
+
"@type": "BreadcrumbList",
|
|
219
|
+
"itemListElement": [
|
|
220
|
+
{
|
|
221
|
+
"@type": "ListItem",
|
|
222
|
+
"position": 1,
|
|
223
|
+
"name": "Home",
|
|
224
|
+
"item": "https://www.100seotools.com"
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"@type": "ListItem",
|
|
228
|
+
"position": 2,
|
|
229
|
+
"name": "SEO Tools",
|
|
230
|
+
"item": "https://www.100seotools.com/tools"
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"@type": "ListItem",
|
|
234
|
+
"position": 3,
|
|
235
|
+
"name": "Keyword Density Checker",
|
|
236
|
+
"item": "https://www.100seotools.com/tools/keyword-density-checker"
|
|
237
|
+
}
|
|
238
|
+
]
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
### Organization (about, contact pages)
|
|
245
|
+
```js
|
|
246
|
+
{
|
|
247
|
+
"@context": "https://schema.org",
|
|
248
|
+
"@type": "Organization",
|
|
249
|
+
"name": "100 SEO Tools",
|
|
250
|
+
"url": "https://www.100seotools.com",
|
|
251
|
+
"logo": "https://www.100seotools.com/logo.png",
|
|
252
|
+
"sameAs": [
|
|
253
|
+
"https://twitter.com/100seotools",
|
|
254
|
+
"https://www.linkedin.com/company/100seotools"
|
|
255
|
+
],
|
|
256
|
+
"contactPoint": {
|
|
257
|
+
"@type": "ContactPoint",
|
|
258
|
+
"contactType": "customer support",
|
|
259
|
+
"email": "hello@100seotools.com"
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Combining Multiple Schemas on One Page
|
|
267
|
+
|
|
268
|
+
A tool page can have BreadcrumbList + SoftwareApplication + FAQPage:
|
|
269
|
+
|
|
270
|
+
```jsx
|
|
271
|
+
export default function ToolPage() {
|
|
272
|
+
return (
|
|
273
|
+
<>
|
|
274
|
+
<JsonLd data={breadcrumbSchema} />
|
|
275
|
+
<JsonLd data={softwareApplicationSchema} />
|
|
276
|
+
<JsonLd data={faqSchema} />
|
|
277
|
+
{/* page content */}
|
|
278
|
+
</>
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Each schema lives in its own `<script>` tag — do NOT merge them into one object.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Validation
|
|
288
|
+
|
|
289
|
+
Always validate schema before deploying:
|
|
290
|
+
|
|
291
|
+
1. **Google Rich Results Test** — https://search.google.com/test/rich-results
|
|
292
|
+
2. **Schema.org Validator** — https://validator.schema.org/
|
|
293
|
+
3. **Google Search Console** → Enhancements → check for warnings after deployment
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
# Quick check: schema appears in HTML
|
|
297
|
+
curl -s https://www.yourdomain.com/tools/keyword-density | grep -A 5 "application/ld+json"
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Schema Markup Checklist
|
|
303
|
+
|
|
304
|
+
- [ ] Homepage has `WebSite` schema
|
|
305
|
+
- [ ] Tool/app pages have `SoftwareApplication` schema
|
|
306
|
+
- [ ] Blog posts have `BlogPosting` / `Article` schema
|
|
307
|
+
- [ ] FAQ sections have `FAQPage` schema
|
|
308
|
+
- [ ] Step-by-step guides have `HowTo` schema
|
|
309
|
+
- [ ] All non-homepage pages have `BreadcrumbList`
|
|
310
|
+
- [ ] About/contact page has `Organization` schema
|
|
311
|
+
- [ ] All URLs in schema are absolute HTTPS
|
|
312
|
+
- [ ] Schema validated with Google Rich Results Test
|
|
313
|
+
- [ ] No schema errors in Google Search Console
|
|
314
|
+
|
|
315
|
+
## Limitations
|
|
316
|
+
|
|
317
|
+
- Does not guarantee rich-result eligibility or display; Google and other consumers decide whether to use valid schema.
|
|
318
|
+
- Generated examples must be adapted to the site's real content, legal entity details, ratings, pricing, and availability.
|
|
319
|
+
- Always validate deployed HTML, not only source code, because frameworks and rendering modes can change the final markup.
|
|
@@ -2,13 +2,17 @@
|
|
|
2
2
|
name: sendblue-api
|
|
3
3
|
description: "Send and receive iMessage, SMS, and RCS from application code via the Sendblue HTTP API — text, media, group messages, send styles, reactions, typing indicators, status callbacks, and inbound webhooks."
|
|
4
4
|
category: api-integration
|
|
5
|
-
risk:
|
|
5
|
+
risk: critical
|
|
6
6
|
source: community
|
|
7
7
|
source_type: official
|
|
8
8
|
date_added: "2026-05-22"
|
|
9
9
|
author: AnthonyFirth
|
|
10
10
|
tags: [sendblue, imessage, sms, rcs, messaging, api, webhooks]
|
|
11
11
|
tools: [claude, cursor, gemini]
|
|
12
|
+
plugin:
|
|
13
|
+
targets:
|
|
14
|
+
codex: blocked
|
|
15
|
+
claude: blocked
|
|
12
16
|
---
|
|
13
17
|
|
|
14
18
|
# Sendblue API
|
|
@@ -167,6 +171,7 @@ Status callback payloads (`outbound`) mirror the send-message response and updat
|
|
|
167
171
|
## Security & Safety Notes
|
|
168
172
|
|
|
169
173
|
- Keep `sb-api-key-id` and `sb-api-secret-key` server-side. They are not safe in browser, mobile, or CI logs.
|
|
174
|
+
- Treat every outbound send, contact/webhook mutation, read receipt, reaction, or typing indicator as state-changing. Preview the recipient, sender line, content, and callback/webhook changes, then wait for explicit user confirmation before sending.
|
|
170
175
|
- Webhook endpoints should be on HTTPS and idempotent — same `message_handle` may arrive more than once.
|
|
171
176
|
- Sensitive data in message content is visible in lock-screen previews on the recipient's device. Don't embed secrets, tokens, or full PII — link to an authenticated dashboard or shortened payload instead.
|
|
172
177
|
- Rotate API keys from the Sendblue dashboard if either value is exposed; the old pair is invalidated on rotation.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sendblue-cli
|
|
3
3
|
description: "Send iMessage and SMS from the shell via the @sendblue/cli npm package — outbound sends, contact management, and account setup with no API client or webhook server required."
|
|
4
4
|
category: api-integration
|
|
5
|
-
risk:
|
|
5
|
+
risk: critical
|
|
6
6
|
source: community
|
|
7
7
|
source_repo: sendblue-api/sendblue-cli
|
|
8
8
|
source_type: official
|
|
@@ -12,6 +12,10 @@ tags: [sendblue, imessage, sms, cli, messaging, notifications]
|
|
|
12
12
|
tools: [claude, cursor, gemini]
|
|
13
13
|
license: "MIT"
|
|
14
14
|
license_source: "https://github.com/sendblue-api/sendblue-cli/blob/main/LICENSE"
|
|
15
|
+
plugin:
|
|
16
|
+
targets:
|
|
17
|
+
codex: blocked
|
|
18
|
+
claude: blocked
|
|
15
19
|
---
|
|
16
20
|
|
|
17
21
|
# Sendblue CLI
|
|
@@ -121,6 +125,7 @@ To text yourself at the end of every agent turn, register a `Stop` hook in `sett
|
|
|
121
125
|
## Security & Safety Notes
|
|
122
126
|
|
|
123
127
|
- Credentials are written to `~/.sendblue/credentials.json` with mode `600`. Treat that file like an API key — do not commit it, do not copy it across machines without the same posture.
|
|
128
|
+
- Treat every outbound send, contact setup, login, or account setup action as state-changing. Preview the recipient, message body, and account/email target, then wait for explicit user confirmation before running it.
|
|
124
129
|
- Run the CLI as the OS user that owns the credentials file. `sudo` writes a separate copy under root's home and silently desyncs.
|
|
125
130
|
- Outbound messages to phone numbers are not free of consequence — wire `sendblue send` into hooks or loops only after gating on duration or success conditions to avoid spamming the recipient.
|
|
126
131
|
- Verification codes arrive by email; treat the address you registered with as a recovery factor for the account.
|
|
@@ -2,13 +2,17 @@
|
|
|
2
2
|
name: sendblue-notify
|
|
3
3
|
description: "Text the user's phone when a long-running task, agent turn, or scheduled job finishes — via @sendblue/cli for outbound, optionally wired to a Claude Code Stop hook for automatic fire."
|
|
4
4
|
category: automation
|
|
5
|
-
risk:
|
|
5
|
+
risk: critical
|
|
6
6
|
source: community
|
|
7
7
|
source_type: official
|
|
8
8
|
date_added: "2026-05-22"
|
|
9
9
|
author: AnthonyFirth
|
|
10
10
|
tags: [sendblue, imessage, sms, notifications, hooks, claude-code, automation]
|
|
11
11
|
tools: [claude, cursor, gemini]
|
|
12
|
+
plugin:
|
|
13
|
+
targets:
|
|
14
|
+
codex: blocked
|
|
15
|
+
claude: blocked
|
|
12
16
|
---
|
|
13
17
|
|
|
14
18
|
# Sendblue Notify
|
|
@@ -146,6 +150,7 @@ You can install both: textme on a server for inbound, notify as a local `Stop`-h
|
|
|
146
150
|
## Security & Safety Notes
|
|
147
151
|
|
|
148
152
|
- **Lock-screen previews leak.** Anyone holding the phone can read notification copy. Do not embed secrets, customer data, full error stacks, or auth tokens. Link to a log, dashboard, or PR instead.
|
|
153
|
+
- **Confirm before sending or wiring hooks.** Preview the destination, message template, trigger, and duration gate; wait for explicit user confirmation before running `sendblue send` or editing hook config.
|
|
149
154
|
- **Automated outbound is a footgun.** A misconfigured `Stop` hook can fire dozens of messages a minute. Always gate by duration and prove the threshold in a dry run before committing.
|
|
150
155
|
- **Per-user numbers.** The destination phone number is a personal identifier — keep it in user-local config (env var, gitignored file), not in committed repo files or CI logs.
|
|
151
156
|
- **Free-plan verification is silent.** If the destination contact hasn't texted in once, sends return an API error but the user just sees "no text arrived". Confirm verification before wiring an unattended hook.
|
|
@@ -12,6 +12,10 @@ tags: [textme, sendblue, imessage, sms, claude-code, daemon, remote-control, aut
|
|
|
12
12
|
tools: [claude, cursor, gemini]
|
|
13
13
|
license: "MIT"
|
|
14
14
|
license_source: "https://github.com/njerschow/textme/blob/main/LICENSE"
|
|
15
|
+
plugin:
|
|
16
|
+
targets:
|
|
17
|
+
codex: blocked
|
|
18
|
+
claude: blocked
|
|
15
19
|
---
|
|
16
20
|
|
|
17
21
|
# TextMe
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: social-metadata-hardening
|
|
3
|
+
description: "Fix social sharing previews so URLs render as rich cards on Facebook, LinkedIn, X/Twitter, WhatsApp, Telegram, Slack, and Discord. Covers OG tags, Twitter cards, absolute image URLs, and metadata debugging."
|
|
4
|
+
category: seo
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
date_added: "2026-05-31"
|
|
9
|
+
author: Whoisabhishekadhikari
|
|
10
|
+
tags: [seo, open-graph, twitter-card, social-sharing, og-image, nextjs, metadata]
|
|
11
|
+
tools: [claude, cursor, gemini, claude-code]
|
|
12
|
+
version: 1.0.0
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Social Metadata Hardening Skill
|
|
16
|
+
|
|
17
|
+
Fix social sharing so every important URL unfurls as a rich card across all platforms.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## When to Use
|
|
22
|
+
|
|
23
|
+
- Use when shared links show missing, stale, cropped, or incorrect previews on social and chat platforms.
|
|
24
|
+
- Use when auditing Open Graph, Twitter/X card, image URL, alt text, or `metadataBase` coverage in a web app.
|
|
25
|
+
- Use before launch when every public page needs predictable rich previews across LinkedIn, X, Facebook, WhatsApp, Slack, Discord, and Telegram.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Why Previews Break
|
|
30
|
+
|
|
31
|
+
| Problem | Root Cause |
|
|
32
|
+
|---------|-----------|
|
|
33
|
+
| No preview at all | Missing og:title, og:description, or og:image |
|
|
34
|
+
| Broken image | Relative URL (must be absolute) |
|
|
35
|
+
| Wrong image size | Image not 1200×630px (OG standard) |
|
|
36
|
+
| Plain text card | Twitter card type missing or set to `summary` |
|
|
37
|
+
| Stale preview | Platform caching old metadata |
|
|
38
|
+
| Metadata missing on crawl | Tags added by client-side JS (crawlers don't run JS) |
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## The Gold Standard Metadata Block
|
|
43
|
+
|
|
44
|
+
Every shareable page needs ALL of these in static HTML:
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
// Next.js App Router — lib/socialMetadata.js
|
|
48
|
+
export function buildSocialMetadata({
|
|
49
|
+
title,
|
|
50
|
+
description,
|
|
51
|
+
path, // '/blog/my-post'
|
|
52
|
+
image, // '/images/og/my-post.jpg' or full URL
|
|
53
|
+
imageAlt,
|
|
54
|
+
imageWidth = 1200,
|
|
55
|
+
imageHeight = 630,
|
|
56
|
+
}) {
|
|
57
|
+
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || 'https://www.yourdomain.com';
|
|
58
|
+
|
|
59
|
+
// Always produce an absolute URL
|
|
60
|
+
const imageUrl = image?.startsWith('http') ? image : `${baseUrl}${image}`;
|
|
61
|
+
const pageUrl = `${baseUrl}${path}`;
|
|
62
|
+
|
|
63
|
+
// Detect MIME type from extension
|
|
64
|
+
const ext = imageUrl.split('.').pop().toLowerCase();
|
|
65
|
+
const mimeMap = { jpg: 'image/jpeg', jpeg: 'image/jpeg', png: 'image/png', webp: 'image/webp' };
|
|
66
|
+
const imageType = mimeMap[ext] || 'image/jpeg';
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
title,
|
|
70
|
+
description,
|
|
71
|
+
alternates: { canonical: pageUrl },
|
|
72
|
+
openGraph: {
|
|
73
|
+
title,
|
|
74
|
+
description,
|
|
75
|
+
url: pageUrl,
|
|
76
|
+
type: 'website', // use 'article' for blog posts
|
|
77
|
+
images: [{
|
|
78
|
+
url: imageUrl,
|
|
79
|
+
secureUrl: imageUrl, // explicit HTTPS version
|
|
80
|
+
width: imageWidth,
|
|
81
|
+
height: imageHeight,
|
|
82
|
+
alt: imageAlt || title,
|
|
83
|
+
type: imageType,
|
|
84
|
+
}],
|
|
85
|
+
},
|
|
86
|
+
twitter: {
|
|
87
|
+
card: 'summary_large_image', // NOT 'summary' — that shows a tiny image
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
images: [imageUrl],
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Applying the Helper
|
|
99
|
+
|
|
100
|
+
### Static page
|
|
101
|
+
```js
|
|
102
|
+
// app/about/page.js
|
|
103
|
+
import { buildSocialMetadata } from '@/lib/socialMetadata';
|
|
104
|
+
|
|
105
|
+
export const metadata = buildSocialMetadata({
|
|
106
|
+
title: 'About Us | My Site',
|
|
107
|
+
description: 'Learn about our team and mission.',
|
|
108
|
+
path: '/about',
|
|
109
|
+
image: '/images/og/about.jpg',
|
|
110
|
+
imageAlt: 'The My Site team',
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Dynamic page (blog post, tool page)
|
|
115
|
+
```js
|
|
116
|
+
// app/blog/[slug]/page.js
|
|
117
|
+
import { buildSocialMetadata } from '@/lib/socialMetadata';
|
|
118
|
+
|
|
119
|
+
export async function generateMetadata({ params }) {
|
|
120
|
+
const post = await getPost(params.slug);
|
|
121
|
+
return buildSocialMetadata({
|
|
122
|
+
title: `${post.title} | My Blog`,
|
|
123
|
+
description: post.excerpt,
|
|
124
|
+
path: `/blog/${params.slug}`,
|
|
125
|
+
image: post.ogImage || '/images/og/default.jpg',
|
|
126
|
+
imageAlt: post.title,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Homepage (app/layout.js or app/page.js)
|
|
132
|
+
```js
|
|
133
|
+
export const metadata = {
|
|
134
|
+
metadataBase: new URL('https://www.yourdomain.com'), // REQUIRED for absolute URLs
|
|
135
|
+
...buildSocialMetadata({
|
|
136
|
+
title: 'My Site — Tagline Here',
|
|
137
|
+
description: 'Site-wide description.',
|
|
138
|
+
path: '/',
|
|
139
|
+
image: '/images/og/home.jpg',
|
|
140
|
+
}),
|
|
141
|
+
};
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
> ⚠️ **`metadataBase` is critical.** Without it, Next.js generates relative OG image URLs that every platform rejects.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## OG Image Checklist
|
|
149
|
+
|
|
150
|
+
Good OG images:
|
|
151
|
+
- **1200 × 630px** (2:1 ratio — works on all platforms)
|
|
152
|
+
- **Under 8MB** (Facebook limit)
|
|
153
|
+
- Served over **HTTPS**
|
|
154
|
+
- File name has **no spaces** (use hyphens)
|
|
155
|
+
- Format: **JPEG or PNG** (WebP works on most but not all crawlers)
|
|
156
|
+
- **Accessible via GET** with no authentication
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# Verify your OG image is reachable and correct size
|
|
160
|
+
curl -sI https://www.yourdomain.com/images/og/home.jpg | grep -i "content-type\|content-length\|status"
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Platform-Specific Notes
|
|
166
|
+
|
|
167
|
+
### Facebook / Meta
|
|
168
|
+
- Caches aggressively — use the [Sharing Debugger](https://developers.facebook.com/tools/debug/) to force recrawl
|
|
169
|
+
- Minimum image: 200×200px (but use 1200×630 for quality)
|
|
170
|
+
- Needs: `og:title`, `og:description`, `og:image`, `og:url`
|
|
171
|
+
|
|
172
|
+
### X / Twitter
|
|
173
|
+
- Use `twitter:card = summary_large_image` for full-width images
|
|
174
|
+
- `twitter:image` must be an absolute URL
|
|
175
|
+
- Use the [Card Validator](https://cards-dev.twitter.com/validator) to test
|
|
176
|
+
|
|
177
|
+
### LinkedIn
|
|
178
|
+
- Caches hard — use [Post Inspector](https://www.linkedin.com/post-inspector/) to refresh
|
|
179
|
+
- Respects `og:` tags; ignores `twitter:` tags
|
|
180
|
+
- Image must be ≥1.91:1 aspect ratio
|
|
181
|
+
|
|
182
|
+
### WhatsApp / Telegram
|
|
183
|
+
- Read OG tags on first share; cache can last hours
|
|
184
|
+
- Re-share after a few hours for the cache to clear naturally
|
|
185
|
+
|
|
186
|
+
### Slack / Discord
|
|
187
|
+
- Both use OG tags; both cache
|
|
188
|
+
- Discord also supports `og:type = article` for richer embeds
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Debugging Social Previews
|
|
193
|
+
|
|
194
|
+
### 1. Check raw HTML for tags
|
|
195
|
+
```bash
|
|
196
|
+
curl -s https://www.yourdomain.com/blog/my-post | grep -i "og:\|twitter:"
|
|
197
|
+
```
|
|
198
|
+
If tags don't appear → they're being added by JavaScript (not crawlable). Fix: move to `export const metadata` or `generateMetadata`.
|
|
199
|
+
|
|
200
|
+
### 2. Validate with platform tools
|
|
201
|
+
| Platform | Tool |
|
|
202
|
+
|----------|------|
|
|
203
|
+
| Facebook | https://developers.facebook.com/tools/debug/ |
|
|
204
|
+
| LinkedIn | https://www.linkedin.com/post-inspector/ |
|
|
205
|
+
| Twitter/X | https://cards-dev.twitter.com/validator |
|
|
206
|
+
| General | https://metatags.io |
|
|
207
|
+
|
|
208
|
+
### 3. Force cache refresh
|
|
209
|
+
After deploying fixes, paste the URL into each platform's debugger and click "Fetch new scrape information" (or equivalent).
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Social Metadata Checklist
|
|
214
|
+
|
|
215
|
+
- [ ] `metadataBase` set in root layout
|
|
216
|
+
- [ ] All shareable pages use shared `buildSocialMetadata` helper
|
|
217
|
+
- [ ] OG image URLs are absolute (start with `https://`)
|
|
218
|
+
- [ ] `secureUrl` set equal to `url` in OG image block
|
|
219
|
+
- [ ] Image is 1200×630px, under 8MB, HTTPS
|
|
220
|
+
- [ ] `twitter:card` is `summary_large_image` (not `summary`)
|
|
221
|
+
- [ ] Image alt text present
|
|
222
|
+
- [ ] Tags visible in raw HTML (not JavaScript-rendered)
|
|
223
|
+
- [ ] All platform debuggers show correct preview
|
|
224
|
+
- [ ] Cache refreshed on all platforms after deployment
|
|
225
|
+
|
|
226
|
+
## Limitations
|
|
227
|
+
|
|
228
|
+
- Cannot force immediate cache refresh on every social platform; some previews may remain stale after a correct fix.
|
|
229
|
+
- Requires deployed, publicly reachable URLs for reliable validation with platform debuggers.
|
|
230
|
+
- Does not replace brand, accessibility, or legal review of image text, alt text, and preview copy.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: socialclaw
|
|
3
3
|
description: "Agent-first social media publishing skill — schedule and publish posts across 13 platforms (X, LinkedIn, Instagram, Facebook Pages, TikTok, Discord, Telegram, YouTube, Reddit, WordPress, Pinterest) via a single workspace API key."
|
|
4
4
|
category: marketing
|
|
5
|
-
risk:
|
|
5
|
+
risk: critical
|
|
6
6
|
source: community
|
|
7
7
|
source_repo: ndesv21/socialclaw
|
|
8
8
|
source_type: community
|
|
@@ -12,6 +12,10 @@ tags: [social-media, publishing, scheduling, marketing, twitter, linkedin, insta
|
|
|
12
12
|
tools: [claude]
|
|
13
13
|
license: "MIT"
|
|
14
14
|
license_source: "https://github.com/ndesv21/socialclaw/blob/main/LICENSE"
|
|
15
|
+
plugin:
|
|
16
|
+
targets:
|
|
17
|
+
codex: blocked
|
|
18
|
+
claude: blocked
|
|
15
19
|
---
|
|
16
20
|
|
|
17
21
|
# SocialClaw — Social Media Publisher
|
|
@@ -103,5 +107,6 @@ Website: [getsocialclaw.com](https://getsocialclaw.com)
|
|
|
103
107
|
## Limitations
|
|
104
108
|
|
|
105
109
|
- Requires a valid SocialClaw workspace API key; do not attempt publishing without explicit user-provided credentials.
|
|
110
|
+
- Treat every publish, schedule, delete, or account-changing action as state-changing: show the target platforms, content, media, and timing, then wait for explicit user confirmation before calling the service.
|
|
106
111
|
- Platform availability, rate limits, analytics fields, and scheduling behavior depend on the upstream SocialClaw service.
|
|
107
112
|
- This skill describes the publishing workflow; it does not replace platform-specific compliance, brand review, or legal approval before posting.
|
|
@@ -51,9 +51,11 @@ Comprehensive guide to using uv, an extremely fast Python package installer and
|
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
53
|
# macOS/Linux
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
sh /
|
|
54
|
+
tmpdir="$(mktemp -d)"
|
|
55
|
+
trap 'rm -rf "$tmpdir"' EXIT
|
|
56
|
+
curl -LsSf https://astral.sh/uv/install.sh -o "$tmpdir/uv-install.sh"
|
|
57
|
+
sed -n '1,160p' "$tmpdir/uv-install.sh"
|
|
58
|
+
sh "$tmpdir/uv-install.sh"
|
|
57
59
|
|
|
58
60
|
# Windows (PowerShell)
|
|
59
61
|
powershell -NoProfile -Command "Invoke-WebRequest https://astral.sh/uv/install.ps1 -OutFile $env:TEMP\\uv-install.ps1; Get-Content $env:TEMP\\uv-install.ps1 -TotalCount 120; powershell -ExecutionPolicy Bypass -File $env:TEMP\\uv-install.ps1"
|