@opendirectory.dev/skills 0.1.0

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 (212) hide show
  1. package/.claude/skills/claude-md-generator/.env.example +7 -0
  2. package/.claude/skills/claude-md-generator/README.md +78 -0
  3. package/.claude/skills/claude-md-generator/SKILL.md +248 -0
  4. package/.claude/skills/claude-md-generator/evals/evals.json +35 -0
  5. package/.claude/skills/claude-md-generator/references/section-guide.md +175 -0
  6. package/dist/e2e.test.d.ts +1 -0
  7. package/dist/e2e.test.js +62 -0
  8. package/dist/fs-adapters.d.ts +4 -0
  9. package/dist/fs-adapters.js +101 -0
  10. package/dist/fs-adapters.test.d.ts +1 -0
  11. package/dist/fs-adapters.test.js +108 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +211 -0
  14. package/dist/transformers.d.ts +6 -0
  15. package/dist/transformers.js +2 -0
  16. package/package.json +25 -0
  17. package/registry.json +226 -0
  18. package/skills/blog-cover-image-cli/.github/workflows/publish.yml +19 -0
  19. package/skills/blog-cover-image-cli/LICENSE +15 -0
  20. package/skills/blog-cover-image-cli/README.md +126 -0
  21. package/skills/blog-cover-image-cli/SKILL.md +7 -0
  22. package/skills/blog-cover-image-cli/agent-skill/blog-cover-generator/README.md +30 -0
  23. package/skills/blog-cover-image-cli/agent-skill/blog-cover-generator/SKILL.md +72 -0
  24. package/skills/blog-cover-image-cli/bin/cli.js +226 -0
  25. package/skills/blog-cover-image-cli/examples/100x_UX_Research_AI_Agent.png +0 -0
  26. package/skills/blog-cover-image-cli/examples/Firecrawl-supabase-bolt.png +0 -0
  27. package/skills/blog-cover-image-cli/examples/Git-City_Case_study_Cover_Image.jpg +0 -0
  28. package/skills/blog-cover-image-cli/examples/THE DISTRIBUTION LAYER (2).png +0 -0
  29. package/skills/blog-cover-image-cli/examples/canva-perplexity-duolingo-cover-image.png +0 -0
  30. package/skills/blog-cover-image-cli/examples/gamma-mistral-veed.png +0 -0
  31. package/skills/blog-cover-image-cli/examples/server-survival-case-study-cover-image(1).png +0 -0
  32. package/skills/blog-cover-image-cli/examples/viral-meme-automation.png +0 -0
  33. package/skills/blog-cover-image-cli/index.js +2 -0
  34. package/skills/blog-cover-image-cli/package-lock.json +2238 -0
  35. package/skills/blog-cover-image-cli/package.json +37 -0
  36. package/skills/blog-cover-image-cli/src/geminiGenerator.js +126 -0
  37. package/skills/blog-cover-image-cli/src/imageValidator.js +54 -0
  38. package/skills/blog-cover-image-cli/src/logoFetcher.js +86 -0
  39. package/skills/claude-md-generator/.env.example +7 -0
  40. package/skills/claude-md-generator/README.md +78 -0
  41. package/skills/claude-md-generator/SKILL.md +254 -0
  42. package/skills/claude-md-generator/evals/evals.json +35 -0
  43. package/skills/claude-md-generator/references/section-guide.md +175 -0
  44. package/skills/cook-the-blog/README.md +86 -0
  45. package/skills/cook-the-blog/SKILL.md +130 -0
  46. package/skills/dependency-update-bot/.env.example +13 -0
  47. package/skills/dependency-update-bot/README.md +101 -0
  48. package/skills/dependency-update-bot/SKILL.md +376 -0
  49. package/skills/dependency-update-bot/evals/evals.json +45 -0
  50. package/skills/dependency-update-bot/references/changelog-patterns.md +201 -0
  51. package/skills/docs-from-code/.env.example +13 -0
  52. package/skills/docs-from-code/README.md +97 -0
  53. package/skills/docs-from-code/SKILL.md +160 -0
  54. package/skills/docs-from-code/evals/evals.json +29 -0
  55. package/skills/docs-from-code/references/extraction-guide.md +174 -0
  56. package/skills/docs-from-code/references/output-template.md +135 -0
  57. package/skills/docs-from-code/scripts/extract_py.py +238 -0
  58. package/skills/docs-from-code/scripts/extract_ts.ts +284 -0
  59. package/skills/docs-from-code/scripts/package.json +18 -0
  60. package/skills/explain-this-pr/README.md +74 -0
  61. package/skills/explain-this-pr/SKILL.md +130 -0
  62. package/skills/explain-this-pr/evals/evals.json +35 -0
  63. package/skills/google-trends-api-skills/README.md +78 -0
  64. package/skills/google-trends-api-skills/SKILL.md +7 -0
  65. package/skills/google-trends-api-skills/google-trends-api/SKILL.md +163 -0
  66. package/skills/google-trends-api-skills/google-trends-api/references/api-responses.md +188 -0
  67. package/skills/google-trends-api-skills/google-trends-api/scripts/discover_keywords.py +344 -0
  68. package/skills/google-trends-api-skills/seo-keyword-research/SKILL.md +205 -0
  69. package/skills/google-trends-api-skills/seo-keyword-research/references/keyword-placement-guide.md +89 -0
  70. package/skills/google-trends-api-skills/seo-keyword-research/references/tech-blog-examples.md +207 -0
  71. package/skills/google-trends-api-skills/seo-keyword-research/scripts/blog_seo_research.py +373 -0
  72. package/skills/hackernews-intel/.env.example +33 -0
  73. package/skills/hackernews-intel/README.md +161 -0
  74. package/skills/hackernews-intel/SKILL.md +156 -0
  75. package/skills/hackernews-intel/evals/evals.json +35 -0
  76. package/skills/hackernews-intel/package.json +15 -0
  77. package/skills/hackernews-intel/scripts/monitor-hn.js +258 -0
  78. package/skills/kill-the-standup/.env.example +22 -0
  79. package/skills/kill-the-standup/README.md +84 -0
  80. package/skills/kill-the-standup/SKILL.md +169 -0
  81. package/skills/kill-the-standup/evals/evals.json +35 -0
  82. package/skills/kill-the-standup/references/standup-format.md +102 -0
  83. package/skills/linkedin-post-generator/.env.example +14 -0
  84. package/skills/linkedin-post-generator/README.md +107 -0
  85. package/skills/linkedin-post-generator/SKILL.md +228 -0
  86. package/skills/linkedin-post-generator/evals/evals.json +35 -0
  87. package/skills/linkedin-post-generator/references/linkedin-format.md +216 -0
  88. package/skills/linkedin-post-generator/references/output-template.md +154 -0
  89. package/skills/llms-txt-generator/.env.example +18 -0
  90. package/skills/llms-txt-generator/README.md +142 -0
  91. package/skills/llms-txt-generator/SKILL.md +176 -0
  92. package/skills/llms-txt-generator/evals/evals.json +35 -0
  93. package/skills/llms-txt-generator/references/llms-txt-spec.md +88 -0
  94. package/skills/llms-txt-generator/references/output-template.md +76 -0
  95. package/skills/llms-txt-generator/test-output/genzcareer.in/llms.txt +31 -0
  96. package/skills/luma-attendees-scraper/README.md +170 -0
  97. package/skills/luma-attendees-scraper/SKILL.md +7 -0
  98. package/skills/luma-attendees-scraper/luma_attendees_export.js +223 -0
  99. package/skills/meeting-brief-generator/.env.example +21 -0
  100. package/skills/meeting-brief-generator/README.md +90 -0
  101. package/skills/meeting-brief-generator/SKILL.md +275 -0
  102. package/skills/meeting-brief-generator/evals/evals.json +35 -0
  103. package/skills/meeting-brief-generator/references/brief-format.md +114 -0
  104. package/skills/meeting-brief-generator/references/output-template.md +150 -0
  105. package/skills/meta-ads-skill/README.md +100 -0
  106. package/skills/meta-ads-skill/SKILL.md +7 -0
  107. package/skills/meta-ads-skill/meta-ads-skill/SKILL.md +41 -0
  108. package/skills/meta-ads-skill/meta-ads-skill/references/report_templates.md +47 -0
  109. package/skills/meta-ads-skill/meta-ads-skill/references/workflows.md +51 -0
  110. package/skills/meta-ads-skill/meta-ads-skill/scripts/auth_check.py +22 -0
  111. package/skills/meta-ads-skill/meta-ads-skill/scripts/formatters.py +46 -0
  112. package/skills/newsletter-digest/.env.example +20 -0
  113. package/skills/newsletter-digest/README.md +147 -0
  114. package/skills/newsletter-digest/SKILL.md +221 -0
  115. package/skills/newsletter-digest/evals/evals.json +35 -0
  116. package/skills/newsletter-digest/feeds.json +7 -0
  117. package/skills/newsletter-digest/package.json +15 -0
  118. package/skills/newsletter-digest/references/digest-format.md +123 -0
  119. package/skills/newsletter-digest/references/output-template.md +136 -0
  120. package/skills/newsletter-digest/scripts/fetch-feeds.js +141 -0
  121. package/skills/newsletter-digest/scripts/ghost-publish.js +147 -0
  122. package/skills/noise2blog/.env.example +16 -0
  123. package/skills/noise2blog/README.md +107 -0
  124. package/skills/noise2blog/SKILL.md +229 -0
  125. package/skills/noise2blog/evals/evals.json +35 -0
  126. package/skills/noise2blog/references/blog-format.md +188 -0
  127. package/skills/noise2blog/references/output-template.md +184 -0
  128. package/skills/outreach-sequence-builder/.env.example +12 -0
  129. package/skills/outreach-sequence-builder/README.md +108 -0
  130. package/skills/outreach-sequence-builder/SKILL.md +248 -0
  131. package/skills/outreach-sequence-builder/evals/evals.json +36 -0
  132. package/skills/outreach-sequence-builder/references/output-template.md +171 -0
  133. package/skills/outreach-sequence-builder/references/sequence-format.md +167 -0
  134. package/skills/outreach-sequence-builder/references/signal-playbook.md +117 -0
  135. package/skills/position-me/README.md +71 -0
  136. package/skills/position-me/SKILL.md +7 -0
  137. package/skills/position-me/position-me/SKILL.md +50 -0
  138. package/skills/position-me/position-me/references/EVALUATION_SOP.md +40 -0
  139. package/skills/position-me/position-me/references/REPORT_TEMPLATE.md +58 -0
  140. package/skills/position-me/position-me/scripts/extract_links.py +49 -0
  141. package/skills/pr-description-writer/README.md +81 -0
  142. package/skills/pr-description-writer/SKILL.md +141 -0
  143. package/skills/pr-description-writer/evals/evals.json +35 -0
  144. package/skills/pr-description-writer/references/pr-format-guide.md +145 -0
  145. package/skills/producthunt-launch-kit/.env.example +7 -0
  146. package/skills/producthunt-launch-kit/README.md +95 -0
  147. package/skills/producthunt-launch-kit/SKILL.md +380 -0
  148. package/skills/producthunt-launch-kit/evals/evals.json +35 -0
  149. package/skills/producthunt-launch-kit/references/copy-rules.md +124 -0
  150. package/skills/reddit-icp-monitor/.env.example +16 -0
  151. package/skills/reddit-icp-monitor/README.md +117 -0
  152. package/skills/reddit-icp-monitor/SKILL.md +271 -0
  153. package/skills/reddit-icp-monitor/evals/evals.json +40 -0
  154. package/skills/reddit-icp-monitor/references/icp-format.md +131 -0
  155. package/skills/reddit-icp-monitor/references/reply-rules.md +110 -0
  156. package/skills/reddit-post-engine/.env.example +13 -0
  157. package/skills/reddit-post-engine/README.md +103 -0
  158. package/skills/reddit-post-engine/SKILL.md +303 -0
  159. package/skills/reddit-post-engine/evals/evals.json +35 -0
  160. package/skills/reddit-post-engine/references/subreddit-playbook.md +156 -0
  161. package/skills/schema-markup-generator/.env.example +19 -0
  162. package/skills/schema-markup-generator/README.md +114 -0
  163. package/skills/schema-markup-generator/SKILL.md +192 -0
  164. package/skills/schema-markup-generator/evals/evals.json +35 -0
  165. package/skills/schema-markup-generator/references/json-ld-spec.md +263 -0
  166. package/skills/schema-markup-generator/references/output-template.md +556 -0
  167. package/skills/show-hn-writer/.env.example +14 -0
  168. package/skills/show-hn-writer/README.md +88 -0
  169. package/skills/show-hn-writer/SKILL.md +303 -0
  170. package/skills/show-hn-writer/evals/evals.json +35 -0
  171. package/skills/show-hn-writer/references/hn-rules.md +74 -0
  172. package/skills/show-hn-writer/references/title-formulas.md +93 -0
  173. package/skills/stargazer/README.md +79 -0
  174. package/skills/stargazer/SKILL.md +7 -0
  175. package/skills/stargazer/stargazer-skill/SKILL.md +58 -0
  176. package/skills/stargazer/stargazer-skill/assets/.env.example +18 -0
  177. package/skills/stargazer/stargazer-skill/scripts/convert_to_csv.py +63 -0
  178. package/skills/stargazer/stargazer-skill/scripts/count_emails.py +52 -0
  179. package/skills/stargazer/stargazer-skill/scripts/stargazer_deep_extractor.py +450 -0
  180. package/skills/tweet-thread-from-blog/.env.example +14 -0
  181. package/skills/tweet-thread-from-blog/README.md +109 -0
  182. package/skills/tweet-thread-from-blog/SKILL.md +177 -0
  183. package/skills/tweet-thread-from-blog/evals/evals.json +35 -0
  184. package/skills/tweet-thread-from-blog/references/output-template.md +193 -0
  185. package/skills/tweet-thread-from-blog/references/thread-format.md +107 -0
  186. package/skills/twitter-GTM-find-skill/README.md +43 -0
  187. package/skills/twitter-GTM-find-skill/SKILL.md +7 -0
  188. package/skills/twitter-GTM-find-skill/twitter-GTM-find/SKILL.md +37 -0
  189. package/skills/twitter-GTM-find-skill/twitter-GTM-find/references/icp-checklist.md +35 -0
  190. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/package.json +23 -0
  191. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/run_pipeline.sh +8 -0
  192. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/debug.ts +23 -0
  193. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/extractor.ts +79 -0
  194. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/icp-filter.ts +87 -0
  195. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/index.ts +94 -0
  196. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/scraper.ts +41 -0
  197. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/tsconfig.json +13 -0
  198. package/skills/yc-intent-radar-skill/README.md +39 -0
  199. package/skills/yc-intent-radar-skill/SKILL.md +7 -0
  200. package/skills/yc-intent-radar-skill/yc-jobs-scraper/SKILL.md +59 -0
  201. package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/auth.js +29 -0
  202. package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/db.js +62 -0
  203. package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/export_radar_candidates.js +40 -0
  204. package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/package-lock.json +1525 -0
  205. package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/package.json +12 -0
  206. package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/scraper.js +217 -0
  207. package/src/e2e.test.ts +35 -0
  208. package/src/fs-adapters.test.ts +91 -0
  209. package/src/fs-adapters.ts +65 -0
  210. package/src/index.ts +182 -0
  211. package/src/transformers.ts +6 -0
  212. package/tsconfig.json +8 -0
@@ -0,0 +1,303 @@
1
+ ---
2
+ name: reddit-post-engine
3
+ description: Writes and optionally posts a Reddit post for any subreddit, following that subreddit's specific culture and rules. Drafts a title, body, and first comment using the 90/10 rule. Uses Composio Reddit MCP for optional direct posting. Use when asked to post on Reddit, draft a Reddit post, share a project on Reddit, write a subreddit post, or launch something on Reddit. Trigger when a user says "post this on Reddit", "write a Reddit post for r/...", "help me launch on Reddit", "draft something for Reddit", or "how do I share this on Reddit without getting banned".
4
+ compatibility: [claude-code, gemini-cli, github-copilot]
5
+ author: OpenDirectory
6
+ version: 1.0.0
7
+ ---
8
+
9
+ # Reddit Post Engine
10
+
11
+ Draft a Reddit post that fits the subreddit's culture. Optionally post it via Composio.
12
+
13
+ ---
14
+
15
+ **Critical rule:** Never post without confirming subreddit rules. Never include product links in the body: put them in the first comment only if appropriate. Follow the 90/10 rule: your post should add value independent of any product mention.
16
+
17
+ **Anti-spam rule:** Posts that are primarily promotional will be removed and may get the account banned. The goal is to contribute to the community first. Product mentions go in the first comment, and only if the subreddit allows self-promotion.
18
+
19
+ ---
20
+
21
+ ## Step 1: Setup Check
22
+
23
+ ```bash
24
+ echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+set}"
25
+ # Check if Composio Reddit MCP is connected
26
+ claude mcp list 2>/dev/null | grep -i reddit || echo "Composio Reddit MCP: not connected"
27
+ ```
28
+
29
+ **If GEMINI_API_KEY is missing:**
30
+ Stop. Tell the user: "GEMINI_API_KEY is required. Get it at aistudio.google.com. Add it to your .env file."
31
+
32
+ **If Composio Reddit MCP is not connected:**
33
+ Continue. The skill will draft posts but skip the posting step. Inform the user: "Composio Reddit MCP not connected: I'll draft your post for manual submission. To enable direct posting, see the setup instructions in README.md."
34
+
35
+ ---
36
+
37
+ ## Step 2: Gather Context
38
+
39
+ You need:
40
+ - Target subreddit (e.g., r/devops, r/startups, r/SideProject)
41
+ - What you are sharing (project, article, question, discussion, tool)
42
+ - One-sentence description of what it does
43
+ - Why it's relevant to this specific subreddit's community
44
+ - Whether you want a self-post (text) or link post
45
+
46
+ If any of these are missing, ask in one message:
47
+
48
+ "To draft your Reddit post, I need:
49
+ 1. Which subreddit? (e.g., r/devops, r/startups)
50
+ 2. What are you sharing? (project, article, tool, question)
51
+ 3. What does it do? (one sentence, technical)
52
+ 4. Why does this subreddit care about it specifically?"
53
+
54
+ ---
55
+
56
+ ## Step 3: Fetch Subreddit Rules and Culture
57
+
58
+ **Fetch the subreddit's rules:**
59
+ ```bash
60
+ curl -s \
61
+ -H "User-Agent: varnan-skills/1.0" \
62
+ "https://www.reddit.com/r/{SUBREDDIT}/about/rules.json" \
63
+ | python3 -c "
64
+ import sys, json
65
+ d = json.load(sys.stdin)
66
+ rules = d.get('rules', [])
67
+ for r in rules:
68
+ print(f'Rule: {r.get(\"short_name\", \"\")}')
69
+ print(f'Detail: {r.get(\"description\", \"\")[:200]}')
70
+ print()
71
+ "
72
+ ```
73
+
74
+ **Fetch recent top posts to understand tone and style:**
75
+ ```bash
76
+ curl -s \
77
+ -H "User-Agent: varnan-skills/1.0" \
78
+ "https://www.reddit.com/r/{SUBREDDIT}/top.json?t=week&limit=10" \
79
+ | python3 -c "
80
+ import sys, json
81
+ d = json.load(sys.stdin)
82
+ for p in d['data']['children'][:10]:
83
+ pd = p['data']
84
+ print(f'Score: {pd[\"score\"]} | Title: {pd[\"title\"][:100]}')
85
+ "
86
+ ```
87
+
88
+ Note patterns in the top posts:
89
+ - Are titles questions or statements?
90
+ - Do they lead with the technology or the outcome?
91
+ - Are they personal ("I built...") or impersonal ("Tool for...")?
92
+ - What format gets the most engagement in this subreddit?
93
+
94
+ **Check subreddit sidebar for posting rules:**
95
+ ```bash
96
+ curl -s \
97
+ -H "User-Agent: varnan-skills/1.0" \
98
+ "https://www.reddit.com/r/{SUBREDDIT}/about.json" \
99
+ | python3 -c "
100
+ import sys, json
101
+ d = json.load(sys.stdin)
102
+ data = d.get('data', {})
103
+ print('Public description:', data.get('public_description', '')[:300])
104
+ print('Subscribers:', data.get('subscribers', 0))
105
+ "
106
+ ```
107
+
108
+ **Identify the subreddit type:**
109
+
110
+ | Type | Examples | Post style |
111
+ |------|----------|-----------|
112
+ | Technical practitioner | r/devops, r/sysadmin, r/ExperiencedDevs | Technical specifics, no fluff, "I did X and learned Y" |
113
+ | Startup/builder | r/startups, r/SideProject, r/indiehackers | Personal story, metrics, lessons learned |
114
+ | General tech | r/programming, r/technology | News angle, discussion hook, controversial take |
115
+ | Career | r/cscareerquestions, r/ITCareerQuestions | Question format, specific scenario, ask for experience |
116
+ | Niche tool | r/vim, r/rust, r/golang | Deep technical content, code examples, benchmarks |
117
+
118
+ Use the fetched rules and top posts to determine which style applies.
119
+
120
+ ---
121
+
122
+ ## Step 4: Draft the Post with Gemini
123
+
124
+ Write the post content to a temp file and call Gemini:
125
+
126
+ ```bash
127
+ cat > /tmp/reddit-post-request.json << 'ENDJSON'
128
+ {
129
+ "system_instruction": {
130
+ "parts": [{
131
+ "text": "You are a developer who is active in the {SUBREDDIT} community. Write a Reddit post that fits this subreddit's culture. Rules: (1) Write in first person if it is a project or experience post. (2) Do NOT include any product links in the body: links go in the first comment only. (3) The post must add genuine value to the community independent of any product being shared. (4) Match the tone of top posts in this subreddit: {SUBREDDIT_TONE_NOTES}. (5) Title max 300 characters. (6) Body 150-400 words for text posts. (7) No marketing language: no 'game-changing', 'powerful', 'robust', 'seamless', 'innovative'. (8) If the post is about a tool the user built, use the 'I made...' or 'I built...' opener: it performs best on Reddit. (9) Output: title on first line, blank line, then body. No labels, no commentary. Do not use em dashes."
132
+ }]
133
+ },
134
+ "contents": [{
135
+ "parts": [{
136
+ "text": "POST_DETAILS_HERE"
137
+ }]
138
+ }],
139
+ "generationConfig": {
140
+ "temperature": 0.7,
141
+ "maxOutputTokens": 1024
142
+ }
143
+ }
144
+ ENDJSON
145
+
146
+ curl -s -X POST \
147
+ "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
148
+ -H "Content-Type: application/json" \
149
+ -d @/tmp/reddit-post-request.json \
150
+ | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
151
+ ```
152
+
153
+ Replace `POST_DETAILS_HERE` with:
154
+ - Subreddit name and type
155
+ - Top post patterns observed
156
+ - What is being shared and why it's relevant
157
+ - Key technical details
158
+ - Builder's honest motivation
159
+
160
+ ---
161
+
162
+ ## Step 5: Draft the First Comment
163
+
164
+ If the user has a product link or additional context to share, draft a first comment to post immediately after the post goes live.
165
+
166
+ The first comment serves two purposes:
167
+ 1. Provide the link (which keeps the body link-free and feels less promotional)
168
+ 2. Add context that would be too promotional in the post body
169
+
170
+ **First comment rules:**
171
+ - Post this as the first reply to your own post, immediately after it goes live
172
+ - Keep it under 100 words
173
+ - Example format: "Link for those who want to check it out: [URL]: also happy to answer questions about [specific technical thing mentioned in the post]."
174
+ - Only include the first comment if the subreddit allows self-promotion in comments
175
+ - If the subreddit has a "No self-promotion" rule, omit the link entirely
176
+
177
+ ---
178
+
179
+ ## Step 6: Self-QA
180
+
181
+ Check the draft before presenting:
182
+
183
+ **Structure:**
184
+ - [ ] Title does not exceed 300 characters
185
+ - [ ] No links appear in the post body
186
+ - [ ] Post opens in first person (for project/experience posts)
187
+ - [ ] At least one specific technical detail or concrete number included
188
+ - [ ] Post matches the tone of top posts observed in this subreddit (noted in Step 3)
189
+ - [ ] Subreddit rules from Step 3 are not violated
190
+
191
+ **Claude-ism detection: scan for these vocabulary categories and remove all instances:**
192
+
193
+ | Category | Words to remove |
194
+ |----------|----------------|
195
+ | Filler intensifiers | incredibly, absolutely, certainly, definitely, essentially, fundamentally, literally, particularly, quite, rather, really, significantly, simply, truly, ultimately, very |
196
+ | AI hedging | I should note, it's worth noting, it's important to note, as mentioned, as I noted |
197
+ | Hype descriptors | game-changing, revolutionary, powerful, robust, seamless, innovative, best-in-class, cutting-edge, groundbreaking, remarkable |
198
+ | Throat-clearing | In conclusion, in summary, to summarize, overall, first and foremost, last but not least |
199
+ | Unnecessary connectors | Furthermore, moreover, additionally, however (at sentence start), thus, hence, thereby |
200
+ | AI tells | This ensures that, This allows for, This helps to, This enables, delve, utilize, leverage, foster |
201
+
202
+ If any appear: replace with a specific noun, verb, or number. "Very fast" becomes "runs in 12ms". "Powerful tool" becomes what it actually does.
203
+
204
+ **Instant-delete phrase check: these patterns trigger Reddit spam filters or moderator removal:**
205
+
206
+ - Any sentence that reads as an advertisement ("Try [Product] today", "Sign up now", "Get started free")
207
+ - Phrases that imply you are not the builder ("I came across this great tool", "I found this amazing product")
208
+ - First-person possession of users ("our users", "our customers") in subreddits where you have not established community presence
209
+ - "I made X and you can use it to..." followed immediately by a link (promotional structure)
210
+ - Superlatives without qualification ("the best way to...", "the only tool that...")
211
+ - External links in post body (use first comment only)
212
+
213
+ If any instant-delete phrases appear: revise the sentence entirely, not just swap words.
214
+
215
+ ---
216
+
217
+ ## Step 7: Adversarial Review
218
+
219
+ Before presenting the final draft, run a 3-persona review. Each persona reads the post and finds ONE specific problem, quoting the exact text that triggers it.
220
+
221
+ **Persona 1: The Skeptical Practitioner**
222
+ This person has been in r/{SUBREDDIT} for years and has seen hundreds of product launches disguised as posts. Their read:
223
+ - Does any sentence feel promotional even if not explicitly selling?
224
+ - Does the post reveal genuine knowledge of the community's problems, or does it just talk about the product?
225
+ - Is there any claim that a practitioner would roll their eyes at?
226
+
227
+ State the one specific line they would flag and why.
228
+
229
+ **Persona 2: The Moderator**
230
+ This person enforces the rules fetched in Step 3. Their read:
231
+ - Does the post technically comply with subreddit rules?
232
+ - Is the ratio of self-promotion to community contribution acceptable?
233
+ - Would they have seen this exact post structure removed before?
234
+
235
+ State the one specific rule that is at risk of violation, or confirm it is clean.
236
+
237
+ **Persona 3: The Target Reader**
238
+ This is a non-builder community member who matches the subreddit's demographic. Their read:
239
+ - Would they upvote this post even if they never use the product?
240
+ - Is there a takeaway they can apply even if they skip the link in the first comment?
241
+ - Does the opening sentence make them want to keep reading?
242
+
243
+ State the one thing they would stop reading at, or confirm the post holds their attention.
244
+
245
+ After all three personas report: apply any fixes. If no persona found a problem, state "Adversarial review: clean."
246
+
247
+ ---
248
+
249
+ ## Step 8: Post via Composio (Optional)
250
+
251
+ If Composio Reddit MCP is connected and the user confirms they want to post:
252
+
253
+ ```
254
+ Use the reddit-composio MCP tool REDDIT_CREATE_REDDIT_POST with:
255
+ - subreddit: {SUBREDDIT_WITHOUT_r/}
256
+ - title: {TITLE}
257
+ - kind: "self"
258
+ - text: {BODY}
259
+ ```
260
+
261
+ **Before posting, confirm with the user:**
262
+ "Ready to post to r/{SUBREDDIT}. Post title: '{TITLE}'. Shall I go ahead?"
263
+
264
+ Only proceed after explicit confirmation.
265
+
266
+ **After posting:**
267
+ 1. Note the post URL from the response
268
+ 2. If a first comment was drafted, post it immediately using the same MCP with the returned post ID
269
+
270
+ **If posting fails (403, 429, or other error):**
271
+ Present the draft for manual submission. Tell the user: "Direct posting failed ([error code]). Here is your post for manual submission. Copy-paste the title and body at reddit.com/r/{SUBREDDIT}/submit."
272
+
273
+ ---
274
+
275
+ ## Step 9: Present Output
276
+
277
+ ```
278
+ ## Reddit Post: r/{SUBREDDIT}
279
+
280
+ ### Title
281
+ {title}
282
+
283
+ ### Body
284
+ {body}
285
+
286
+ ### First Comment (post immediately after)
287
+ {first comment, if applicable}
288
+
289
+ ---
290
+
291
+ ### Submission Notes
292
+ - Post type: {self/link}
293
+ - Best time to post: {peak hours for this subreddit: weekday mornings US time for most tech subreddits}
294
+ - After posting: Reply to every comment in the first hour: early engagement signals quality to the algorithm
295
+ - Karma note: {If account is new, note that some subreddits require minimum karma before posting}
296
+ ```
297
+
298
+ If the post was already submitted via Composio, replace the output block with:
299
+ ```
300
+ Post submitted: {reddit_post_url}
301
+ ```
302
+
303
+
@@ -0,0 +1,35 @@
1
+ {
2
+ "skill_name": "reddit-post-engine",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "Help me post my open source tool on r/devops. It's called Kargo: a Kubernetes deployment pipeline manager. Written in Go. It solves the problem of managing sequential deployments across multiple clusters without writing custom Argo CD app-of-apps configs.",
7
+ "expected_output": "Agent fetches r/devops subreddit rules and top posts. Notes the technical tone of the subreddit. Drafts a self-post with a title like 'I built Kargo – a deployment pipeline manager for Kubernetes without the app-of-apps complexity'. Body is technical, explains the problem, the approach, a specific tradeoff made. No links in body: link in first comment. Self-QA passes. Post fits r/devops practitioner tone (no marketing language, technical specifics included).",
8
+ "files": []
9
+ },
10
+ {
11
+ "id": 2,
12
+ "prompt": "Write a Reddit post for r/SideProject for my project: a Raycast extension that generates shell aliases from natural language descriptions. Built it because I kept forgetting my own aliases.",
13
+ "expected_output": "Agent fetches r/SideProject top posts. Notes the personal/build-story tone. Drafts post opening with 'I built...' opener. Story includes: why (kept forgetting aliases), what it does (natural language to shell alias), current state (Raycast extension, works for zsh/bash). No product links in body. First comment drafted with link. Post is 150-300 words. Conversational tone.",
14
+ "files": []
15
+ },
16
+ {
17
+ "id": 3,
18
+ "prompt": "Post to Reddit. Here is my project.",
19
+ "expected_output": "Agent recognizes missing required context: target subreddit, what the project does, why it is relevant to that community. Asks all four required questions in a single message before proceeding. Does not draft a post without knowing the target subreddit.",
20
+ "files": []
21
+ },
22
+ {
23
+ "id": 4,
24
+ "prompt": "I want to post on r/startups and r/SideProject and r/indiehackers at the same time. My SaaS just hit $1k MRR and I want to share the story.",
25
+ "expected_output": "Agent drafts three separate posts, one per subreddit, each adapted to the community's tone: r/startups version focuses on the business lessons and what drove MRR growth; r/SideProject version is more personal and celebrates the milestone; r/indiehackers version includes specific numbers and metrics (revenue, users, time to $1k MRR) because that community expects transparency. Advises staggering the posts (not same-day cross-posting) to avoid spam detection.",
26
+ "files": []
27
+ },
28
+ {
29
+ "id": 5,
30
+ "prompt": "Draft a Reddit post for my project and post it to r/devops via Composio.",
31
+ "expected_output": "Agent checks if Composio Reddit MCP is connected. If not connected: drafts the post and informs user how to set up Composio for direct posting (README instructions), presents post for manual submission. If connected: drafts post, shows preview, asks for explicit confirmation before posting. After confirmation, calls REDDIT_CREATE_REDDIT_POST with subreddit (without r/ prefix), title, kind='self', and text body. If posting succeeds, presents the post URL. If posting fails with 403/429, falls back to manual submission instructions.",
32
+ "files": []
33
+ }
34
+ ]
35
+ }
@@ -0,0 +1,156 @@
1
+ # Subreddit Playbook
2
+
3
+ Rules, tone, and post patterns for commonly used subreddits.
4
+
5
+ ---
6
+
7
+ ## r/SideProject
8
+
9
+ **Audience:** Indie builders, hobbyist developers, side project enthusiasts
10
+
11
+ **What works:**
12
+ - "I built X in [timeframe]" opener
13
+ - Share the build story, not just the product
14
+ - Be honest about usage numbers and what is still rough
15
+ - Mention if it is open source or free
16
+
17
+ **What gets removed:**
18
+ - Pure self-promotion with no story
19
+ - Posts that feel like product pages
20
+ - Repeated posts for the same project
21
+
22
+ **Post format:** Self-post. Lead with the build story. Link in first comment.
23
+
24
+ **Karma requirement:** None typically, but very new accounts get flagged
25
+
26
+ ---
27
+
28
+ ## r/startups
29
+
30
+ **Audience:** Early-stage founders, VCs, operator types
31
+
32
+ **What works:**
33
+ - Share a lesson, not just a product
34
+ - Questions about strategy, GTM, or fundraising do well
35
+ - "We tried X and learned Y" posts outperform pure announcement posts
36
+ - Traction numbers signal credibility
37
+
38
+ **What gets removed:**
39
+ - "I launched my startup" posts without a specific hook
40
+ - Soliciting investment
41
+ - Posts that are thinly veiled ads
42
+
43
+ **Post format:** Self-post, 200-400 words. Lead with the non-obvious insight.
44
+
45
+ ---
46
+
47
+ ## r/devops
48
+
49
+ **Audience:** SREs, platform engineers, DevOps practitioners
50
+
51
+ **What works:**
52
+ - Specific technical problem and how you solved it
53
+ - Benchmark numbers, architecture diagrams
54
+ - "How we reduced X by Y%" posts
55
+ - Tool comparisons with real data
56
+
57
+ **What gets removed:**
58
+ - "Check out my tool" without technical depth
59
+ - Posts that read like product marketing
60
+ - Vague questions answerable by googling
61
+
62
+ **Post format:** Self-post with technical depth. Code snippets encouraged.
63
+
64
+ **Post tone:** Very direct. No fluff. Engineers here have low patience for marketing language.
65
+
66
+ ---
67
+
68
+ ## r/programming
69
+
70
+ **Audience:** General developer community, CS nerds, broad technical interest
71
+
72
+ **What works:**
73
+ - Blog post or article link with an interesting angle in the title
74
+ - Show posts for technically novel projects
75
+ - Technical deep-dives
76
+ - Controversial/contrarian takes on tech decisions
77
+
78
+ **What gets removed:**
79
+ - Job posts
80
+ - Tutorial spam
81
+ - Low-effort link posts without discussion value
82
+
83
+ **Post format:** Link post for articles, self-post for discussion. Title should name the technical topic, not just the product.
84
+
85
+ ---
86
+
87
+ ## r/ExperiencedDevs
88
+
89
+ **Audience:** Senior engineers and staff+ level developers
90
+
91
+ **What works:**
92
+ - Nuanced takes on engineering tradeoffs
93
+ - "Career at X level looks like..." experience posts
94
+ - Architecture decision retrospectives
95
+ - Anything that shows you have been burned and learned
96
+
97
+ **What gets removed:**
98
+ - Beginner questions
99
+ - "I just got my first job" posts
100
+ - Pure self-promotion
101
+
102
+ **Tone:** Skeptical audience. They will poke holes in your reasoning. Write defensively: acknowledge weaknesses before commenters do.
103
+
104
+ ---
105
+
106
+ ## r/indiehackers
107
+
108
+ **Audience:** Solo founders, bootstrappers, people building profitable businesses without VC
109
+
110
+ **What works:**
111
+ - Revenue numbers (they love transparency)
112
+ - "Month 6 update" style posts showing growth
113
+ - Failed experiments and what you learned
114
+ - "I quit my job to build X, here is where I am at" stories
115
+
116
+ **What does not work:**
117
+ - VC-backed startups positioning as indie
118
+ - Posts without personal context
119
+ - Generic business advice
120
+
121
+ **Post format:** Self-post. Personal and honest. Numbers matter here.
122
+
123
+ ---
124
+
125
+ ## r/webdev
126
+
127
+ **Audience:** Frontend and full-stack web developers
128
+
129
+ **What works:**
130
+ - Portfolio pieces with technical explanation
131
+ - "I built X, here is how" posts
132
+ - CSS tricks, JS patterns, performance wins
133
+ - Tools that solve a specific web dev pain
134
+
135
+ **Post tone:** Friendly and curious, less intense than r/programming
136
+
137
+ ---
138
+
139
+ ## The 90/10 Rule
140
+
141
+ For any subreddit where you plan to share your own project:
142
+
143
+ Before you post, check your account's recent post history. At least 90% of your posts should be genuine contributions: answering questions, sharing interesting links, participating in discussions. At most 10% should be posts about your own work.
144
+
145
+ If you are posting about your project in multiple subreddits on the same day, stagger the posts. Identical posts across subreddits on the same day trigger spam detection.
146
+
147
+ ---
148
+
149
+ ## Anti-Patterns That Get Posts Removed
150
+
151
+ 1. **Cross-posting the exact same post to 5 subreddits simultaneously**: post one at a time, wait for results
152
+ 2. **Asking friends to upvote**: vote manipulation gets posts and accounts banned
153
+ 3. **Replying to your own post with a second account**: obvious and penalized
154
+ 4. **Using your product URL as the post URL**: for self-posts, keep the link in the first comment
155
+ 5. **"I need feedback" when you want users**: moderators read this correctly
156
+ 6. **Flair violations**: some subreddits require flair; missing it gets the post auto-removed
@@ -0,0 +1,19 @@
1
+ # schema-markup-generator -- Environment Variables
2
+ # ==================================================
3
+ # Most pages work without any API keys.
4
+ # Chrome is needed for JavaScript-rendered pages.
5
+ # GitHub token is needed only for auto-PR support.
6
+
7
+ # Chrome remote debugging port (default: 9222)
8
+ # Start Chrome with: google-chrome --remote-debugging-port=9222
9
+ # On macOS: open -a "Google Chrome" --args --remote-debugging-port=9222
10
+ CHROME_DEBUGGING_PORT=9222
11
+
12
+ # Optional: GitHub personal access token for opening PRs
13
+ # Scopes needed: repo (read + write)
14
+ # Get one at: https://github.com/settings/tokens
15
+ GITHUB_TOKEN=your_github_token_here
16
+
17
+ # Optional: Target GitHub repo slug (e.g. "yourorg/your-site")
18
+ # If set, the agent offers to open a PR automatically
19
+ GITHUB_REPO=your-org/your-repo
@@ -0,0 +1,114 @@
1
+ # schema-markup-generator
2
+
3
+ ![schema-markup-generator](https://github.com/user-attachments/assets/4b5e5bfb-3c33-4a20-afff-59fda19196b4)
4
+
5
+
6
+ Generate valid JSON-LD structured data for any webpage. The agent crawls the page, detects which schema types apply, and outputs a script tag ready to paste into your HTML. Optionally opens a GitHub PR with the markup injected.
7
+
8
+ ## Schema Types Supported
9
+
10
+ | Type | Use When |
11
+ |------|----------|
12
+ | FAQPage | Page has 2 or more visible question/answer pairs |
13
+ | Article / BlogPosting | Page is a blog post or editorial article |
14
+ | Organization | Page represents a company or institution |
15
+ | Product | Page sells or describes a product with pricing |
16
+ | WebSite | Homepage schema with optional sitelinks search |
17
+ | HowTo | Page is a step-by-step guide with numbered steps |
18
+ | BreadcrumbList | Page has visible breadcrumb navigation |
19
+ | SoftwareApplication | Page describes a software tool or app |
20
+ | LocalBusiness | Page represents a physical business location |
21
+
22
+ The agent detects the right type automatically. A single page often gets multiple types (a blog post gets Article and BreadcrumbList, a homepage gets WebSite and Organization).
23
+
24
+ ## Requirements
25
+
26
+ No LLM API key needed. The agent reads the page and generates the markup.
27
+
28
+ Chrome is needed for JavaScript-rendered pages. For static HTML pages or when you paste HTML directly, Chrome is not required.
29
+
30
+ A GitHub token is optional. Without it, the agent outputs the markup as text for you to paste manually.
31
+
32
+ ## Setup
33
+
34
+ ### 1. Start Chrome with remote debugging (for live URLs)
35
+
36
+ ```bash
37
+ # macOS
38
+ open -a "Google Chrome" --args --remote-debugging-port=9222
39
+
40
+ # Linux
41
+ google-chrome --remote-debugging-port=9222
42
+ ```
43
+
44
+ ### 2. Configure environment variables (optional)
45
+
46
+ ```bash
47
+ cp .env.example .env
48
+ # Add GITHUB_TOKEN if you want auto-PR support
49
+ ```
50
+
51
+ ## How to Use
52
+
53
+ From a live URL:
54
+
55
+ ```
56
+ "Generate schema markup for https://example.com/faq"
57
+ "Add structured data to https://example.com/blog/my-post"
58
+ "What schema markup does this page need? https://example.com/about"
59
+ ```
60
+
61
+ From pasted HTML:
62
+
63
+ ```
64
+ "Generate schema markup for this page: [paste HTML]"
65
+ "Add JSON-LD to this HTML: [paste HTML]"
66
+ ```
67
+
68
+ Targeting a specific type:
69
+
70
+ ```
71
+ "Generate FAQPage schema for https://example.com/support"
72
+ "Add Organization schema to our about page: https://example.com/about"
73
+ "Generate Product schema for this page: https://example.com/products/pro"
74
+ ```
75
+
76
+ With auto-PR:
77
+
78
+ ```
79
+ "Generate schema markup for https://example.com/blog/post and open a GitHub PR"
80
+ ```
81
+
82
+ ## Output
83
+
84
+ | Output | Description |
85
+ |--------|-------------|
86
+ | JSON-LD script block | One `<script type="application/ld+json">` block per schema type |
87
+ | Placement instructions | Where to insert the block in your HTML or framework |
88
+ | MISSING field list | Required fields not found on the page that you need to fill in |
89
+ | GitHub PR | If GITHUB_TOKEN and GITHUB_REPO are configured and you confirm |
90
+
91
+ ## Validate Your Markup
92
+
93
+ After applying the markup, validate it at:
94
+
95
+ - Google Rich Results Test: https://search.google.com/test/rich-results
96
+ - Schema.org Validator: https://validator.schema.org
97
+
98
+ ## Project Structure
99
+
100
+ ```
101
+ schema-markup-generator/
102
+ ├── SKILL.md
103
+ ├── README.md
104
+ ├── .env.example
105
+ ├── evals/
106
+ │ └── evals.json
107
+ └── references/
108
+ ├── json-ld-spec.md
109
+ └── output-template.md
110
+ ```
111
+
112
+ ## License
113
+
114
+ MIT