@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.
- package/.claude/skills/claude-md-generator/.env.example +7 -0
- package/.claude/skills/claude-md-generator/README.md +78 -0
- package/.claude/skills/claude-md-generator/SKILL.md +248 -0
- package/.claude/skills/claude-md-generator/evals/evals.json +35 -0
- package/.claude/skills/claude-md-generator/references/section-guide.md +175 -0
- package/dist/e2e.test.d.ts +1 -0
- package/dist/e2e.test.js +62 -0
- package/dist/fs-adapters.d.ts +4 -0
- package/dist/fs-adapters.js +101 -0
- package/dist/fs-adapters.test.d.ts +1 -0
- package/dist/fs-adapters.test.js +108 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +211 -0
- package/dist/transformers.d.ts +6 -0
- package/dist/transformers.js +2 -0
- package/package.json +25 -0
- package/registry.json +226 -0
- package/skills/blog-cover-image-cli/.github/workflows/publish.yml +19 -0
- package/skills/blog-cover-image-cli/LICENSE +15 -0
- package/skills/blog-cover-image-cli/README.md +126 -0
- package/skills/blog-cover-image-cli/SKILL.md +7 -0
- package/skills/blog-cover-image-cli/agent-skill/blog-cover-generator/README.md +30 -0
- package/skills/blog-cover-image-cli/agent-skill/blog-cover-generator/SKILL.md +72 -0
- package/skills/blog-cover-image-cli/bin/cli.js +226 -0
- package/skills/blog-cover-image-cli/examples/100x_UX_Research_AI_Agent.png +0 -0
- package/skills/blog-cover-image-cli/examples/Firecrawl-supabase-bolt.png +0 -0
- package/skills/blog-cover-image-cli/examples/Git-City_Case_study_Cover_Image.jpg +0 -0
- package/skills/blog-cover-image-cli/examples/THE DISTRIBUTION LAYER (2).png +0 -0
- package/skills/blog-cover-image-cli/examples/canva-perplexity-duolingo-cover-image.png +0 -0
- package/skills/blog-cover-image-cli/examples/gamma-mistral-veed.png +0 -0
- package/skills/blog-cover-image-cli/examples/server-survival-case-study-cover-image(1).png +0 -0
- package/skills/blog-cover-image-cli/examples/viral-meme-automation.png +0 -0
- package/skills/blog-cover-image-cli/index.js +2 -0
- package/skills/blog-cover-image-cli/package-lock.json +2238 -0
- package/skills/blog-cover-image-cli/package.json +37 -0
- package/skills/blog-cover-image-cli/src/geminiGenerator.js +126 -0
- package/skills/blog-cover-image-cli/src/imageValidator.js +54 -0
- package/skills/blog-cover-image-cli/src/logoFetcher.js +86 -0
- package/skills/claude-md-generator/.env.example +7 -0
- package/skills/claude-md-generator/README.md +78 -0
- package/skills/claude-md-generator/SKILL.md +254 -0
- package/skills/claude-md-generator/evals/evals.json +35 -0
- package/skills/claude-md-generator/references/section-guide.md +175 -0
- package/skills/cook-the-blog/README.md +86 -0
- package/skills/cook-the-blog/SKILL.md +130 -0
- package/skills/dependency-update-bot/.env.example +13 -0
- package/skills/dependency-update-bot/README.md +101 -0
- package/skills/dependency-update-bot/SKILL.md +376 -0
- package/skills/dependency-update-bot/evals/evals.json +45 -0
- package/skills/dependency-update-bot/references/changelog-patterns.md +201 -0
- package/skills/docs-from-code/.env.example +13 -0
- package/skills/docs-from-code/README.md +97 -0
- package/skills/docs-from-code/SKILL.md +160 -0
- package/skills/docs-from-code/evals/evals.json +29 -0
- package/skills/docs-from-code/references/extraction-guide.md +174 -0
- package/skills/docs-from-code/references/output-template.md +135 -0
- package/skills/docs-from-code/scripts/extract_py.py +238 -0
- package/skills/docs-from-code/scripts/extract_ts.ts +284 -0
- package/skills/docs-from-code/scripts/package.json +18 -0
- package/skills/explain-this-pr/README.md +74 -0
- package/skills/explain-this-pr/SKILL.md +130 -0
- package/skills/explain-this-pr/evals/evals.json +35 -0
- package/skills/google-trends-api-skills/README.md +78 -0
- package/skills/google-trends-api-skills/SKILL.md +7 -0
- package/skills/google-trends-api-skills/google-trends-api/SKILL.md +163 -0
- package/skills/google-trends-api-skills/google-trends-api/references/api-responses.md +188 -0
- package/skills/google-trends-api-skills/google-trends-api/scripts/discover_keywords.py +344 -0
- package/skills/google-trends-api-skills/seo-keyword-research/SKILL.md +205 -0
- package/skills/google-trends-api-skills/seo-keyword-research/references/keyword-placement-guide.md +89 -0
- package/skills/google-trends-api-skills/seo-keyword-research/references/tech-blog-examples.md +207 -0
- package/skills/google-trends-api-skills/seo-keyword-research/scripts/blog_seo_research.py +373 -0
- package/skills/hackernews-intel/.env.example +33 -0
- package/skills/hackernews-intel/README.md +161 -0
- package/skills/hackernews-intel/SKILL.md +156 -0
- package/skills/hackernews-intel/evals/evals.json +35 -0
- package/skills/hackernews-intel/package.json +15 -0
- package/skills/hackernews-intel/scripts/monitor-hn.js +258 -0
- package/skills/kill-the-standup/.env.example +22 -0
- package/skills/kill-the-standup/README.md +84 -0
- package/skills/kill-the-standup/SKILL.md +169 -0
- package/skills/kill-the-standup/evals/evals.json +35 -0
- package/skills/kill-the-standup/references/standup-format.md +102 -0
- package/skills/linkedin-post-generator/.env.example +14 -0
- package/skills/linkedin-post-generator/README.md +107 -0
- package/skills/linkedin-post-generator/SKILL.md +228 -0
- package/skills/linkedin-post-generator/evals/evals.json +35 -0
- package/skills/linkedin-post-generator/references/linkedin-format.md +216 -0
- package/skills/linkedin-post-generator/references/output-template.md +154 -0
- package/skills/llms-txt-generator/.env.example +18 -0
- package/skills/llms-txt-generator/README.md +142 -0
- package/skills/llms-txt-generator/SKILL.md +176 -0
- package/skills/llms-txt-generator/evals/evals.json +35 -0
- package/skills/llms-txt-generator/references/llms-txt-spec.md +88 -0
- package/skills/llms-txt-generator/references/output-template.md +76 -0
- package/skills/llms-txt-generator/test-output/genzcareer.in/llms.txt +31 -0
- package/skills/luma-attendees-scraper/README.md +170 -0
- package/skills/luma-attendees-scraper/SKILL.md +7 -0
- package/skills/luma-attendees-scraper/luma_attendees_export.js +223 -0
- package/skills/meeting-brief-generator/.env.example +21 -0
- package/skills/meeting-brief-generator/README.md +90 -0
- package/skills/meeting-brief-generator/SKILL.md +275 -0
- package/skills/meeting-brief-generator/evals/evals.json +35 -0
- package/skills/meeting-brief-generator/references/brief-format.md +114 -0
- package/skills/meeting-brief-generator/references/output-template.md +150 -0
- package/skills/meta-ads-skill/README.md +100 -0
- package/skills/meta-ads-skill/SKILL.md +7 -0
- package/skills/meta-ads-skill/meta-ads-skill/SKILL.md +41 -0
- package/skills/meta-ads-skill/meta-ads-skill/references/report_templates.md +47 -0
- package/skills/meta-ads-skill/meta-ads-skill/references/workflows.md +51 -0
- package/skills/meta-ads-skill/meta-ads-skill/scripts/auth_check.py +22 -0
- package/skills/meta-ads-skill/meta-ads-skill/scripts/formatters.py +46 -0
- package/skills/newsletter-digest/.env.example +20 -0
- package/skills/newsletter-digest/README.md +147 -0
- package/skills/newsletter-digest/SKILL.md +221 -0
- package/skills/newsletter-digest/evals/evals.json +35 -0
- package/skills/newsletter-digest/feeds.json +7 -0
- package/skills/newsletter-digest/package.json +15 -0
- package/skills/newsletter-digest/references/digest-format.md +123 -0
- package/skills/newsletter-digest/references/output-template.md +136 -0
- package/skills/newsletter-digest/scripts/fetch-feeds.js +141 -0
- package/skills/newsletter-digest/scripts/ghost-publish.js +147 -0
- package/skills/noise2blog/.env.example +16 -0
- package/skills/noise2blog/README.md +107 -0
- package/skills/noise2blog/SKILL.md +229 -0
- package/skills/noise2blog/evals/evals.json +35 -0
- package/skills/noise2blog/references/blog-format.md +188 -0
- package/skills/noise2blog/references/output-template.md +184 -0
- package/skills/outreach-sequence-builder/.env.example +12 -0
- package/skills/outreach-sequence-builder/README.md +108 -0
- package/skills/outreach-sequence-builder/SKILL.md +248 -0
- package/skills/outreach-sequence-builder/evals/evals.json +36 -0
- package/skills/outreach-sequence-builder/references/output-template.md +171 -0
- package/skills/outreach-sequence-builder/references/sequence-format.md +167 -0
- package/skills/outreach-sequence-builder/references/signal-playbook.md +117 -0
- package/skills/position-me/README.md +71 -0
- package/skills/position-me/SKILL.md +7 -0
- package/skills/position-me/position-me/SKILL.md +50 -0
- package/skills/position-me/position-me/references/EVALUATION_SOP.md +40 -0
- package/skills/position-me/position-me/references/REPORT_TEMPLATE.md +58 -0
- package/skills/position-me/position-me/scripts/extract_links.py +49 -0
- package/skills/pr-description-writer/README.md +81 -0
- package/skills/pr-description-writer/SKILL.md +141 -0
- package/skills/pr-description-writer/evals/evals.json +35 -0
- package/skills/pr-description-writer/references/pr-format-guide.md +145 -0
- package/skills/producthunt-launch-kit/.env.example +7 -0
- package/skills/producthunt-launch-kit/README.md +95 -0
- package/skills/producthunt-launch-kit/SKILL.md +380 -0
- package/skills/producthunt-launch-kit/evals/evals.json +35 -0
- package/skills/producthunt-launch-kit/references/copy-rules.md +124 -0
- package/skills/reddit-icp-monitor/.env.example +16 -0
- package/skills/reddit-icp-monitor/README.md +117 -0
- package/skills/reddit-icp-monitor/SKILL.md +271 -0
- package/skills/reddit-icp-monitor/evals/evals.json +40 -0
- package/skills/reddit-icp-monitor/references/icp-format.md +131 -0
- package/skills/reddit-icp-monitor/references/reply-rules.md +110 -0
- package/skills/reddit-post-engine/.env.example +13 -0
- package/skills/reddit-post-engine/README.md +103 -0
- package/skills/reddit-post-engine/SKILL.md +303 -0
- package/skills/reddit-post-engine/evals/evals.json +35 -0
- package/skills/reddit-post-engine/references/subreddit-playbook.md +156 -0
- package/skills/schema-markup-generator/.env.example +19 -0
- package/skills/schema-markup-generator/README.md +114 -0
- package/skills/schema-markup-generator/SKILL.md +192 -0
- package/skills/schema-markup-generator/evals/evals.json +35 -0
- package/skills/schema-markup-generator/references/json-ld-spec.md +263 -0
- package/skills/schema-markup-generator/references/output-template.md +556 -0
- package/skills/show-hn-writer/.env.example +14 -0
- package/skills/show-hn-writer/README.md +88 -0
- package/skills/show-hn-writer/SKILL.md +303 -0
- package/skills/show-hn-writer/evals/evals.json +35 -0
- package/skills/show-hn-writer/references/hn-rules.md +74 -0
- package/skills/show-hn-writer/references/title-formulas.md +93 -0
- package/skills/stargazer/README.md +79 -0
- package/skills/stargazer/SKILL.md +7 -0
- package/skills/stargazer/stargazer-skill/SKILL.md +58 -0
- package/skills/stargazer/stargazer-skill/assets/.env.example +18 -0
- package/skills/stargazer/stargazer-skill/scripts/convert_to_csv.py +63 -0
- package/skills/stargazer/stargazer-skill/scripts/count_emails.py +52 -0
- package/skills/stargazer/stargazer-skill/scripts/stargazer_deep_extractor.py +450 -0
- package/skills/tweet-thread-from-blog/.env.example +14 -0
- package/skills/tweet-thread-from-blog/README.md +109 -0
- package/skills/tweet-thread-from-blog/SKILL.md +177 -0
- package/skills/tweet-thread-from-blog/evals/evals.json +35 -0
- package/skills/tweet-thread-from-blog/references/output-template.md +193 -0
- package/skills/tweet-thread-from-blog/references/thread-format.md +107 -0
- package/skills/twitter-GTM-find-skill/README.md +43 -0
- package/skills/twitter-GTM-find-skill/SKILL.md +7 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/SKILL.md +37 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/references/icp-checklist.md +35 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/package.json +23 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/run_pipeline.sh +8 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/debug.ts +23 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/extractor.ts +79 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/icp-filter.ts +87 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/index.ts +94 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/scraper.ts +41 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/tsconfig.json +13 -0
- package/skills/yc-intent-radar-skill/README.md +39 -0
- package/skills/yc-intent-radar-skill/SKILL.md +7 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/SKILL.md +59 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/auth.js +29 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/db.js +62 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/export_radar_candidates.js +40 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/package-lock.json +1525 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/package.json +12 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/scraper.js +217 -0
- package/src/e2e.test.ts +35 -0
- package/src/fs-adapters.test.ts +91 -0
- package/src/fs-adapters.ts +65 -0
- package/src/index.ts +182 -0
- package/src/transformers.ts +6 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: producthunt-launch-kit
|
|
3
|
+
description: ''
|
|
4
|
+
compatibility: [claude-code, gemini-cli, github-copilot]
|
|
5
|
+
author: OpenDirectory
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Product Hunt Launch Kit
|
|
10
|
+
|
|
11
|
+
Generate every asset you need for a Product Hunt launch: listing copy, maker comment, and day-one social posts.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
**Critical rule:** Product Hunt taglines are maximum 60 characters. Descriptions are maximum 500 characters. Never make factual claims that cannot be verified. Never mention competitor names. Never say "free" unless the product is permanently free (not just a trial).
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Step 1: Gather Product Details
|
|
20
|
+
|
|
21
|
+
You need:
|
|
22
|
+
|
|
23
|
+
- Product name
|
|
24
|
+
- What it does (technical description, one sentence)
|
|
25
|
+
- Primary use case and target user
|
|
26
|
+
- Key differentiator from existing tools
|
|
27
|
+
- Pricing: free, freemium, paid (starting price)
|
|
28
|
+
- Open source: yes/no
|
|
29
|
+
- Launch date (for scheduling context)
|
|
30
|
+
- Any credentials, launch discount, or promo code to offer
|
|
31
|
+
- 2-3 things that make it worth upvoting (honest reasons, not marketing)
|
|
32
|
+
|
|
33
|
+
If any of these are missing, ask in one message before proceeding.
|
|
34
|
+
|
|
35
|
+
Also check for project context files:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
ls README.md 2>/dev/null && echo "README found"
|
|
39
|
+
ls package.json 2>/dev/null && echo "package.json found"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
If README.md exists, read the first 80 lines to extract product description and key features before asking questions.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Step 2: Gallery Strategy
|
|
47
|
+
|
|
48
|
+
Product Hunt requires screenshots. Most listings fail because of weak or missing gallery images. Plan these before writing copy.
|
|
49
|
+
|
|
50
|
+
**Spec:** 1270×760px, PNG or JPG, max 8 images. The first image is the hero: it appears in feeds and cards.
|
|
51
|
+
|
|
52
|
+
**Five-position framework:**
|
|
53
|
+
|
|
54
|
+
| Position | Purpose | What to show |
|
|
55
|
+
|----------|---------|-------------|
|
|
56
|
+
| 1 (Hero) | First impression in feeds | Product in use, clean UI or terminal output, no text overlays |
|
|
57
|
+
| 2 (Feature demo) | Show the core action | The thing that makes the product click: the "aha" moment |
|
|
58
|
+
| 3 (Before/After) | Show the problem being solved | Split screen: messy/slow state vs. clean/fast state |
|
|
59
|
+
| 4 (Social proof) | Build credibility | A real quote, a stat, or a before/after metric from a real user |
|
|
60
|
+
| 5 (Technical differentiator) | Address skeptics | Architecture diagram, benchmark, or the unusual technical decision |
|
|
61
|
+
|
|
62
|
+
If the product is a CLI tool or library, screenshots of terminal output work well. Annotate with arrows pointing to the important part.
|
|
63
|
+
|
|
64
|
+
**Video (optional but high-impact):** A 60-90 second demo. Under 2 minutes. No voiceover required: screen capture with captions works.
|
|
65
|
+
|
|
66
|
+
Tell the user: "Plan [N] gallery images before launch day. The hero image (position 1) is the most important. Here's what to capture for each position: [list above, customized for this product]."
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Step 3: Generate Tagline Variants
|
|
71
|
+
|
|
72
|
+
The tagline appears directly under the product name on Product Hunt. It is the most read copy on your listing.
|
|
73
|
+
|
|
74
|
+
**Hard limits:**
|
|
75
|
+
- Maximum 60 characters (including spaces)
|
|
76
|
+
- No period at the end
|
|
77
|
+
- No hashtags
|
|
78
|
+
- Do not start with the product name
|
|
79
|
+
- No superlatives: "best", "fastest", "easiest", "most powerful"
|
|
80
|
+
- No questions
|
|
81
|
+
|
|
82
|
+
**Tagline formula:** `[Action verb] + [what it does] + [key differentiator]`
|
|
83
|
+
|
|
84
|
+
Generate five tagline variants:
|
|
85
|
+
|
|
86
|
+
1. **Outcome-first:** What the user achieves ("Ship docs without leaving your codebase")
|
|
87
|
+
2. **Problem-first:** Names the pain that is solved ("No more copy-pasting between Figma and code")
|
|
88
|
+
3. **Technical-angle:** For developer tools, lead with the tech ("SQLite to shareable web app in one command")
|
|
89
|
+
4. **Comparison-free alternative:** Positions without naming competitors ("Git-native code review that works inside VS Code")
|
|
90
|
+
5. **Plain-English:** No jargon, widest possible audience ("Turns any RSS feed into a daily email digest")
|
|
91
|
+
|
|
92
|
+
After generating, count characters for each. Flag any that exceed 60 characters and revise.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Step 4: Write the Listing Description
|
|
97
|
+
|
|
98
|
+
The description appears below the tagline. Maximum 500 characters. It displays in search results and link previews.
|
|
99
|
+
|
|
100
|
+
**Structure:**
|
|
101
|
+
- Sentence 1: What it does and who it's for (specific)
|
|
102
|
+
- Sentence 2: The key feature or technical approach that makes it work
|
|
103
|
+
- Sentence 3 (optional): Pricing or availability
|
|
104
|
+
|
|
105
|
+
**Description rules:**
|
|
106
|
+
- 280-500 characters (shorter is fine; longer is truncated in previews)
|
|
107
|
+
- Present tense throughout
|
|
108
|
+
- No hype adjectives
|
|
109
|
+
- No "I": write in third person or imperative ("Turns your...", "Connects to...", not "I built...")
|
|
110
|
+
- No links (they do not render)
|
|
111
|
+
- If open source, say so: "Open source and self-hostable."
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Step 5: Write the Maker Comment
|
|
116
|
+
|
|
117
|
+
The maker comment is the most important driver of Product Hunt success. It is your first reply to your own post, posted within 60 seconds of launch.
|
|
118
|
+
|
|
119
|
+
**Hard limits:**
|
|
120
|
+
- 300-400 words
|
|
121
|
+
- Must be posted within 60 seconds of the product going live
|
|
122
|
+
- First-person, conversational
|
|
123
|
+
- Tell the origin story
|
|
124
|
+
- Acknowledge the obvious alternative and explain why you built this anyway
|
|
125
|
+
- End with a specific question to invite comments
|
|
126
|
+
|
|
127
|
+
**Structure:**
|
|
128
|
+
|
|
129
|
+
**Opening (2-3 sentences):** Why you built this. The real story: what frustrated you, what gap you noticed, what problem you kept hitting. No "I'm thrilled to announce."
|
|
130
|
+
|
|
131
|
+
**What it does (3-5 sentences):** Explain the core mechanic. What happens when someone uses it for the first time. Include one specific technical detail that shows you thought hard about the problem.
|
|
132
|
+
|
|
133
|
+
**Who it's for (2-3 sentences):** Describe the specific person who will get the most value. Not "everyone who needs X": a specific persona: "If you're a solo dev who deploys on Friday afternoons and dreads..." or "If you've ever spent 20 minutes explaining the same PR context to three different reviewers..."
|
|
134
|
+
|
|
135
|
+
**Honest caveat (1-2 sentences):** What it does NOT do. What is still rough. This builds trust and filters in the right early users.
|
|
136
|
+
|
|
137
|
+
**Call for feedback (1-2 sentences):** Ask a specific question. "We haven't figured out the right approach for [specific edge case]: would love to know how you've handled it." or "The thing I'm most unsure about is [X]: does that matter to you?"
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Step 6: Generate All Assets with Gemini
|
|
142
|
+
|
|
143
|
+
Write all assets in one Gemini call:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
cat > /tmp/ph-launch-request.json << 'ENDJSON'
|
|
147
|
+
{
|
|
148
|
+
"system_instruction": {
|
|
149
|
+
"parts": [{
|
|
150
|
+
"text": "You are writing Product Hunt launch copy. Generate all assets in sequence, clearly labeled. Rules: taglines max 60 chars, description max 500 chars, maker comment 300-400 words first-person. No marketing words: 'revolutionary', 'game-changing', 'powerful', 'robust', 'seamless', 'innovative', 'best-in-class', 'streamline'. No competitor names. No superlatives in taglines. Do not use em dashes. For social posts: tweets max 280 chars, no hashtags in tweet threads (they reduce signal quality on technical posts). LinkedIn post 150-300 words, professional but not stiff. Email sequence: 4 emails, each under 150 words, subject line under 50 chars. Output each asset with a clear header. No commentary between sections."
|
|
151
|
+
}]
|
|
152
|
+
},
|
|
153
|
+
"contents": [{
|
|
154
|
+
"parts": [{
|
|
155
|
+
"text": "PRODUCT_DETAILS_HERE"
|
|
156
|
+
}]
|
|
157
|
+
}],
|
|
158
|
+
"generationConfig": {
|
|
159
|
+
"temperature": 0.7,
|
|
160
|
+
"maxOutputTokens": 4096
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
ENDJSON
|
|
164
|
+
|
|
165
|
+
curl -s -X POST \
|
|
166
|
+
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
|
|
167
|
+
-H "Content-Type: application/json" \
|
|
168
|
+
-d @/tmp/ph-launch-request.json \
|
|
169
|
+
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Replace `PRODUCT_DETAILS_HERE` with all gathered context: product name, description, use case, differentiator, pricing, and any maker notes from Step 1.
|
|
173
|
+
|
|
174
|
+
Request these assets in the prompt:
|
|
175
|
+
1. Five tagline variants (with character counts)
|
|
176
|
+
2. Listing description (with character count)
|
|
177
|
+
3. Maker comment (300-400 words)
|
|
178
|
+
4. Tweet thread for launch day (5-7 tweets, 280 chars each)
|
|
179
|
+
5. LinkedIn post (150-300 words)
|
|
180
|
+
6. Email sequence (4 emails: existing users, newsletter, day-of reminder, follow-up)
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Step 7: Self-QA
|
|
185
|
+
|
|
186
|
+
Before presenting:
|
|
187
|
+
|
|
188
|
+
**Taglines:**
|
|
189
|
+
- [ ] All under 60 characters (count each)
|
|
190
|
+
- [ ] None start with the product name
|
|
191
|
+
- [ ] None contain superlatives
|
|
192
|
+
- [ ] None contain marketing words
|
|
193
|
+
|
|
194
|
+
**Description:**
|
|
195
|
+
- [ ] Under 500 characters (count)
|
|
196
|
+
- [ ] Third person or imperative voice (no "I")
|
|
197
|
+
- [ ] No links
|
|
198
|
+
|
|
199
|
+
**Maker comment:**
|
|
200
|
+
- [ ] 300-400 words (count)
|
|
201
|
+
- [ ] Opens with the real origin story (not "I'm excited to...")
|
|
202
|
+
- [ ] Includes one honest caveat
|
|
203
|
+
- [ ] Ends with a specific question
|
|
204
|
+
- [ ] No marketing language
|
|
205
|
+
- [ ] No em dashes
|
|
206
|
+
|
|
207
|
+
**Tweet thread:**
|
|
208
|
+
- [ ] Each tweet under 280 characters (count)
|
|
209
|
+
- [ ] No hashtags
|
|
210
|
+
- [ ] First tweet is the hook: most compelling thing about the product
|
|
211
|
+
|
|
212
|
+
If any item fails, revise before presenting. Do not present drafts with QA failures.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Step 8: Present the Full Launch Kit
|
|
217
|
+
|
|
218
|
+
Present in this exact order:
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
## Product Hunt Launch Kit: [Product Name]
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
### Taglines (choose one)
|
|
226
|
+
1. [tagline]: [char count]
|
|
227
|
+
2. [tagline]: [char count]
|
|
228
|
+
3. [tagline]: [char count]
|
|
229
|
+
4. [tagline]: [char count]
|
|
230
|
+
5. [tagline]: [char count]
|
|
231
|
+
|
|
232
|
+
**Recommendation:** [one-sentence reason to prefer tagline X]
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
### Listing Description
|
|
237
|
+
[description text]
|
|
238
|
+
[char count] / 500
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
### Maker Comment (post within 60 seconds of launch)
|
|
243
|
+
[maker comment text]
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
### Launch Day Tweets
|
|
248
|
+
Tweet 1/6: [text]
|
|
249
|
+
Tweet 2/6: [text]
|
|
250
|
+
...
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
### LinkedIn Post
|
|
255
|
+
[post text]
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
### Email Sequence
|
|
260
|
+
|
|
261
|
+
**Email 1: Existing Users (send 1 week before)**
|
|
262
|
+
Subject: [subject]
|
|
263
|
+
[body]
|
|
264
|
+
|
|
265
|
+
**Email 2: Newsletter / Audience (send day before)**
|
|
266
|
+
Subject: [subject]
|
|
267
|
+
[body]
|
|
268
|
+
|
|
269
|
+
**Email 3: Day-of Reminder (send at 12:01 AM PST)**
|
|
270
|
+
Subject: [subject]
|
|
271
|
+
[body]
|
|
272
|
+
|
|
273
|
+
**Email 4: Follow-up (send 48 hours after launch)**
|
|
274
|
+
Subject: [subject]
|
|
275
|
+
[body]
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
### Self-Hunt vs. Top Hunter Decision
|
|
280
|
+
|
|
281
|
+
Answer these questions to decide:
|
|
282
|
+
|
|
283
|
+
| Question | Self-Hunt | Get a Hunter |
|
|
284
|
+
|----------|-----------|--------------|
|
|
285
|
+
| Do you have 500+ Twitter/LinkedIn followers in your target audience? | Yes | No |
|
|
286
|
+
| Does your product have an existing user base to rally? | Yes | No |
|
|
287
|
+
| Is your product technical and you have a personal brand in dev communities? | Yes | No |
|
|
288
|
+
| Is this your first launch with no audience yet? | No | Yes |
|
|
289
|
+
| Does a top hunter (500+ followers on PH) already use your product? | No | Yes |
|
|
290
|
+
|
|
291
|
+
If 3+ answers point to "Get a Hunter": reach out to hunters at least 2 weeks before launch day. Frame the ask as sharing something you built that they would genuinely want to know about: not asking for a favor.
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
### 30-Day Pre-Launch Preparation
|
|
296
|
+
|
|
297
|
+
**Day 30-21: Teaser Phase**
|
|
298
|
+
- [ ] Post a "building in public" update on Twitter/LinkedIn: what problem you are solving and why
|
|
299
|
+
- [ ] Identify 3-5 hunters with 500+ PH followers who match your product category
|
|
300
|
+
- [ ] Start building a supporter list (everyone who would upvote on launch day): team, users, investors, friends in tech
|
|
301
|
+
- [ ] Set up a simple "notify me on launch" page (even a TypeForm or Google Form)
|
|
302
|
+
|
|
303
|
+
**Day 20-8: Asset Phase**
|
|
304
|
+
- [ ] Capture all 5 gallery images at 1270×760px (see gallery strategy above)
|
|
305
|
+
- [ ] Record 60-90 second demo video if applicable
|
|
306
|
+
- [ ] Draft all copy from this kit: tagline, description, maker comment, social posts, emails
|
|
307
|
+
- [ ] Send Email 1 (existing users) at Day 8
|
|
308
|
+
|
|
309
|
+
**Day 7-2: Final Prep**
|
|
310
|
+
- [ ] Send Email 2 (newsletter) at Day 2
|
|
311
|
+
- [ ] Message your supporter list directly (Slack, DM, email): not a mass blast, personal messages
|
|
312
|
+
- [ ] Schedule tweet thread and LinkedIn post
|
|
313
|
+
- [ ] Do a dry run: check PH listing preview, verify all gallery images display correctly
|
|
314
|
+
- [ ] Confirm maker comment is under 400 words and saved somewhere you can paste instantly
|
|
315
|
+
|
|
316
|
+
**Day 1: Launch Day**
|
|
317
|
+
- [ ] Post goes live at 12:01 AM PST
|
|
318
|
+
- [ ] Send Email 3 (day-of reminder) immediately after going live
|
|
319
|
+
- [ ] Maker comment posted within 60 seconds of launch
|
|
320
|
+
- [ ] Tweet thread posted in the first 30 minutes
|
|
321
|
+
- [ ] LinkedIn post published
|
|
322
|
+
- [ ] Reply to every comment within 2 hours: PH algorithm rewards active makers
|
|
323
|
+
- [ ] Do not ask for upvotes directly: ask people to "check it out" or "share feedback"
|
|
324
|
+
- [ ] DM your supporter list with a direct link: not "go upvote" but "we just launched, would love your thoughts"
|
|
325
|
+
- [ ] First comment with any promo code posted within 5 minutes of launch
|
|
326
|
+
|
|
327
|
+
**Day 2: Follow-Up**
|
|
328
|
+
- [ ] Send Email 4 (48-hour follow-up) with results and thank-you
|
|
329
|
+
- [ ] Post a results update on Twitter/LinkedIn: upvotes, comments, lessons
|
|
330
|
+
- [ ] Reply to any overnight comments you missed
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
### Upvote Benchmarks
|
|
335
|
+
|
|
336
|
+
| Upvotes | Outcome |
|
|
337
|
+
|---------|---------|
|
|
338
|
+
| 50-100 | Listed but not front page |
|
|
339
|
+
| 200-400 | Competitive front page placement |
|
|
340
|
+
| 500-800 | Top 5 of the day |
|
|
341
|
+
| 800+ | Product of the Day |
|
|
342
|
+
| 1500+ | Product of the Week contender |
|
|
343
|
+
|
|
344
|
+
First-hour velocity matters more than final count. 100 upvotes in the first hour beats 400 spread over 24 hours.
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
### Hour-by-Hour Launch Day Timeline
|
|
349
|
+
|
|
350
|
+
| Time (PST) | Action |
|
|
351
|
+
|------------|--------|
|
|
352
|
+
| 12:01 AM | Post goes live. Do not schedule: be awake and click manually. |
|
|
353
|
+
| 12:02 AM | Maker comment posted (have it in clipboard, paste and submit immediately) |
|
|
354
|
+
| 12:05 AM | First comment (promo code or context) posted |
|
|
355
|
+
| 12:15 AM | Tweet thread live |
|
|
356
|
+
| 12:30 AM | LinkedIn post live |
|
|
357
|
+
| 12:30 AM | Personal DMs to your 10 most-engaged supporters |
|
|
358
|
+
| 1:00 AM | Check for first comments, reply to all |
|
|
359
|
+
| 7:00 AM | Morning US traffic peak. Check ranking. Reply to overnight comments. |
|
|
360
|
+
| 9:00 AM | Send Email 3 (day-of reminder) if you held it for morning send |
|
|
361
|
+
| 12:00 PM | Midday check. Reply to all comments. Post a "midday update" tweet if trending. |
|
|
362
|
+
| 5:00 PM | Evening US traffic peak. Final push to supporter list if needed. |
|
|
363
|
+
| 11:59 PM | Results final. Screenshot your placement. |
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
### Launch Checklist
|
|
368
|
+
- [ ] Post goes live at 12:01 AM PST on launch day (manual click, not scheduled)
|
|
369
|
+
- [ ] Maker comment copied to clipboard, posted within 60 seconds of launch
|
|
370
|
+
- [ ] Supporter list of 200+ people ready to message personally on launch day
|
|
371
|
+
- [ ] Gallery images and video (if any) uploaded and previewed before launch
|
|
372
|
+
- [ ] All 4 emails drafted and scheduled
|
|
373
|
+
- [ ] Reply to every comment on launch day: PH rewards active makers
|
|
374
|
+
- [ ] Do not ask for upvotes directly: ask people to "check it out" or "share feedback"
|
|
375
|
+
- [ ] First comment (with any promo code) posted within 5 minutes of launch
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "producthunt-launch-kit",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Generate a Product Hunt launch kit for my product: Replyflow. It drafts personalized cold email replies using AI. Target user: sales reps who get 50+ emails a day. Freemium: free for 10 replies/month, $29/month unlimited. I'm launching next Tuesday.",
|
|
7
|
+
"expected_output": "Agent gathers all required context (has enough from the prompt). Generates: 5 tagline variants all under 60 characters with character counts shown, listing description under 500 characters, maker comment 300-400 words opening with origin story not 'Hi PH!', tweet thread of 5-7 tweets each under 280 characters with no hashtags, LinkedIn post 150-300 words, 4-email sequence with subject lines under 50 chars. All copy avoids marketing adjectives. Maker comment includes honest caveat and ends with specific question. Launch checklist included at end.",
|
|
8
|
+
"files": []
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": 2,
|
|
12
|
+
"prompt": "Write my Product Hunt tagline. Product: Doppler: a secrets manager that syncs env vars across environments.",
|
|
13
|
+
"expected_output": "Agent generates 5 tagline variants. All are under 60 characters (agent counts each one). None start with 'Doppler'. None contain adjectives like 'powerful', 'simple', 'easy'. Each follows a different formula: outcome-first, problem-first, technical-angle, comparison-free alternative, plain-English. Agent recommends one with a one-sentence reason. All variants describe what Doppler does, not what it is.",
|
|
14
|
+
"files": []
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 3,
|
|
18
|
+
"prompt": "Write my maker comment for Product Hunt. My product is Raycast, a launcher app for Mac.",
|
|
19
|
+
"expected_output": "Agent writes maker comment that is 300-400 words. Does NOT open with 'Hi Product Hunt!' or 'Thrilled to announce'. Opens with origin story or personal motivation. Includes at least one technical detail about how it works. Identifies who should NOT use it or what it does not do. Ends with a specific question for the community. No marketing language. No em dashes. Reads like a thoughtful HN-style comment, not a press release.",
|
|
20
|
+
"files": []
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": 4,
|
|
24
|
+
"prompt": "Generate a Product Hunt kit. My README is attached.",
|
|
25
|
+
"expected_output": "Agent reads README.md to extract: product name, what it does, key features, pricing, tech stack. Asks only for information not found in the README (typically: personal motivation/origin story, launch discount if any, specific launch date). Does not re-ask for information visible in the file. Generates full kit using README + user answers. All copy respects the 60/500 char limits.",
|
|
26
|
+
"files": ["README.md"]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": 5,
|
|
30
|
+
"prompt": "Write a Product Hunt description that says our tool is free.",
|
|
31
|
+
"expected_output": "Agent checks what 'free' means in context. If the product has paid tiers, flags this: 'You mentioned free: does the product have paid plans too? If so, I'll use \"Free to start\" instead of \"free\" to avoid misleading PH visitors.' If the product is genuinely permanently free, writes 'Free and open source' or similar. Never writes 'free' when the context indicates freemium. Explains the reason for the distinction.",
|
|
32
|
+
"files": []
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Product Hunt Copy Rules
|
|
2
|
+
|
|
3
|
+
## Tagline
|
|
4
|
+
|
|
5
|
+
**The tagline is the second thing people read after the product name.**
|
|
6
|
+
|
|
7
|
+
It appears:
|
|
8
|
+
- Under the product name on the listing
|
|
9
|
+
- In Twitter/X cards when the listing is shared
|
|
10
|
+
- In email digests Product Hunt sends to subscribers
|
|
11
|
+
|
|
12
|
+
**Hard constraints:**
|
|
13
|
+
- 60 characters maximum (enforced by PH)
|
|
14
|
+
- No period at the end
|
|
15
|
+
- Do not start with the product name (it appears just above already)
|
|
16
|
+
- No hashtags
|
|
17
|
+
|
|
18
|
+
**What makes a tagline work:**
|
|
19
|
+
|
|
20
|
+
It names a specific action or outcome. Not what the product IS: what it DOES.
|
|
21
|
+
|
|
22
|
+
Good:
|
|
23
|
+
- "Turn changelogs into product announcements" (60 chars)
|
|
24
|
+
- "Open source Heroku alternative built on Kubernetes" (51 chars)
|
|
25
|
+
- "Ship faster by keeping your docs next to your code" (52 chars)
|
|
26
|
+
|
|
27
|
+
Bad:
|
|
28
|
+
- "The best tool for developer productivity" (adjective, vague)
|
|
29
|
+
- "A powerful platform for modern teams" (filler words, no specifics)
|
|
30
|
+
- "Your new favorite way to manage tasks" (second-person, sounds like an ad)
|
|
31
|
+
|
|
32
|
+
**Formula:** `[Active verb] + [specific object] + [optional context or differentiator]`
|
|
33
|
+
|
|
34
|
+
Count characters before submitting. The submission form will reject anything over 60.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Description
|
|
39
|
+
|
|
40
|
+
**The description appears below the tagline. Maximum 500 characters.**
|
|
41
|
+
|
|
42
|
+
This is your elevator pitch. It has to work in the notification email, in search results, and on the listing page.
|
|
43
|
+
|
|
44
|
+
**Structure:**
|
|
45
|
+
1. What it does and who it's for (specific)
|
|
46
|
+
2. Key capability or technical differentiator
|
|
47
|
+
3. Pricing or availability (optional but helpful)
|
|
48
|
+
|
|
49
|
+
**Rules:**
|
|
50
|
+
- Third person or imperative voice
|
|
51
|
+
- No "I" or "we" (save that for the maker comment)
|
|
52
|
+
- No links (they do not render in the description field)
|
|
53
|
+
- No list formatting (it does not render well in all contexts)
|
|
54
|
+
- 280-500 characters is the ideal range
|
|
55
|
+
- Present tense
|
|
56
|
+
|
|
57
|
+
Good example (312 chars):
|
|
58
|
+
> Datasette is a tool for exploring and publishing data. It helps data journalists, scientists, and developers share SQLite databases as interactive websites. Open source. Works with any SQLite file. Deploy to any server in minutes.
|
|
59
|
+
|
|
60
|
+
Bad example:
|
|
61
|
+
> We built this amazing tool that will completely change how you work with data! Our powerful platform makes it easy for anyone to share data in a beautiful, seamless, innovative way!
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Maker Comment
|
|
66
|
+
|
|
67
|
+
**The maker comment is the single highest-leverage action on launch day.**
|
|
68
|
+
|
|
69
|
+
PH ranks products partly on engagement. A maker who responds to every comment in the first two hours sends a strong signal.
|
|
70
|
+
|
|
71
|
+
**Mechanics:**
|
|
72
|
+
- Post it as a comment on your own listing, within 60 seconds of launch
|
|
73
|
+
- This is not the time for polished marketing copy: write like a human
|
|
74
|
+
- It will be the first comment on the listing
|
|
75
|
+
|
|
76
|
+
**What the comment should contain:**
|
|
77
|
+
|
|
78
|
+
1. Why you built it (the honest version, not the press release version)
|
|
79
|
+
2. The core mechanic: what happens when someone uses it
|
|
80
|
+
3. A specific technical decision or tradeoff you made
|
|
81
|
+
4. Who should NOT use it (or what it does not do): this builds trust
|
|
82
|
+
5. A specific question for the community
|
|
83
|
+
|
|
84
|
+
**What kills maker comments:**
|
|
85
|
+
- "Hi PH! Thrilled to share..." (sounds like an announcement, not a human)
|
|
86
|
+
- "Our product is the best solution for..." (sounds like marketing)
|
|
87
|
+
- Not responding to any comments for the first 2 hours
|
|
88
|
+
- Asking people to upvote ("if you like this, please upvote!")
|
|
89
|
+
|
|
90
|
+
**Tone reference:** Think of the tone of a thoughtful comment on Hacker News. Not a pitch. Not a tutorial. A practitioner talking to peers.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Promo Codes
|
|
95
|
+
|
|
96
|
+
If you have a promo code for PH users:
|
|
97
|
+
- Post it in a separate comment after the maker comment (not in the maker comment itself)
|
|
98
|
+
- Format: "Product Hunt special: use [CODE] for [discount/free tier/extended trial]"
|
|
99
|
+
- Include expiry date if there is one
|
|
100
|
+
- Lifetime deals tend to perform well on PH
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## What NOT to Do
|
|
105
|
+
|
|
106
|
+
**Vote ring:** Do not ask friends, Discord members, Slack groups, or anyone else to upvote your launch. PH detects coordinated voting. It will bury your product. "Vote rings" are the fastest way to get your listing penalized.
|
|
107
|
+
|
|
108
|
+
**Correct ask:** "We launched on PH today: would love your feedback" or "Check it out if it's relevant to you." That is fine. Asking specifically for upvotes is not.
|
|
109
|
+
|
|
110
|
+
**Hashtags:** Product Hunt does not use hashtags. Do not include them in copy.
|
|
111
|
+
|
|
112
|
+
**Competitor naming:** Do not name competitors in your listing. Focus on what you do, not what you are not.
|
|
113
|
+
|
|
114
|
+
**Free vs freemium:** If it has a free tier but also paid plans, say "Free to start" or "Free tier available." Do not say "free" unless it is permanently, completely free.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Launch Timing
|
|
119
|
+
|
|
120
|
+
- Products launch at 12:01 AM Pacific Time on the selected day
|
|
121
|
+
- The first 4 hours determine front page placement
|
|
122
|
+
- Tuesday, Wednesday, Thursday are the highest-traffic days
|
|
123
|
+
- Avoid holiday weeks and major tech conference days (everyone is heads-down)
|
|
124
|
+
- Notify your audience the night before so they are ready at launch time
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# reddit-icp-monitor — Environment Variables
|
|
2
|
+
# ============================================
|
|
3
|
+
# Gemini is required. Reddit credentials are optional (higher rate limit).
|
|
4
|
+
|
|
5
|
+
# Required: Google Gemini API key for relevance scoring and reply drafting
|
|
6
|
+
# Get it: aistudio.google.com, Get API key
|
|
7
|
+
GEMINI_API_KEY=your_gemini_api_key_here
|
|
8
|
+
|
|
9
|
+
# Optional: Reddit OAuth credentials for 60 RPM (vs 10 RPM with public endpoints)
|
|
10
|
+
# Register a "script"-type app at: reddit.com/prefs/apps
|
|
11
|
+
# Select "script" app type, fill in a redirect URI (http://localhost works)
|
|
12
|
+
# Note: App approval may take several days as of November 2025
|
|
13
|
+
REDDIT_CLIENT_ID=your_reddit_client_id_here
|
|
14
|
+
REDDIT_CLIENT_SECRET=your_reddit_client_secret_here
|
|
15
|
+
REDDIT_USERNAME=your_reddit_username_here
|
|
16
|
+
REDDIT_PASSWORD=your_reddit_password_here
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# reddit-icp-monitor
|
|
2
|
+
|
|
3
|
+
<img width="1280" height="640" alt="reddit-icp-monitor" src="https://github.com/user-attachments/assets/8182b73f-1f8d-4812-9061-165fd8aeb0e8" />
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Watch subreddits for people describing the exact problem you solve. Score each post for ICP relevance. Draft a helpful, non-spammy reply for every high-signal match.
|
|
7
|
+
|
|
8
|
+
## What It Does
|
|
9
|
+
|
|
10
|
+
- Reads your ICP definition from docs/icp.md (or asks 3 questions to build it)
|
|
11
|
+
- Searches specified subreddits for posts matching your pain point phrases
|
|
12
|
+
- Scores each candidate post 1-5 using Gemini (how clearly does this person have the problem you solve?)
|
|
13
|
+
- Drafts a helpful reply for every post scoring 4 or 5, in the correct mode (vent, how-do-you, or tool recommendation)
|
|
14
|
+
- Enforces a hard rule: replies never name your product unless the post explicitly asks for tool recommendations
|
|
15
|
+
- Saves the full report to docs/reddit-intel/YYYY-MM-DD.md
|
|
16
|
+
|
|
17
|
+
## Requirements
|
|
18
|
+
|
|
19
|
+
| Requirement | Purpose | How to Set Up |
|
|
20
|
+
|------------|---------|--------------|
|
|
21
|
+
| Gemini API key | Relevance scoring and reply drafting | aistudio.google.com, Get API key |
|
|
22
|
+
| Reddit credentials (optional) | Higher rate limit (60 RPM vs 10 RPM) | reddit.com/prefs/apps, create a script app |
|
|
23
|
+
|
|
24
|
+
Reddit credentials are optional. The skill uses Reddit's public JSON endpoints by default, which require no setup and support 10 RPM. That is enough for most monitoring sessions.
|
|
25
|
+
|
|
26
|
+
## Setup
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
cp .env.example .env
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Fill in:
|
|
33
|
+
- `GEMINI_API_KEY` (required)
|
|
34
|
+
- Reddit credentials (optional, see OAuth Upgrade below)
|
|
35
|
+
|
|
36
|
+
## How to Use
|
|
37
|
+
|
|
38
|
+
First run (no docs/icp.md yet):
|
|
39
|
+
```
|
|
40
|
+
"Monitor Reddit for my ICP signals"
|
|
41
|
+
"Scan subreddits for people who need my product"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The skill asks 3 questions to build your ICP definition and saves it to docs/icp.md.
|
|
45
|
+
|
|
46
|
+
Subsequent runs (docs/icp.md exists):
|
|
47
|
+
```
|
|
48
|
+
"Check Reddit for buying signals"
|
|
49
|
+
"Run the Reddit ICP monitor for this week"
|
|
50
|
+
"Find ICP posts from the last month"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Specify a time window:
|
|
54
|
+
```
|
|
55
|
+
"Monitor Reddit for ICP signals from the last 24 hours"
|
|
56
|
+
"Check Reddit for this month's pain point posts"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Output
|
|
60
|
+
|
|
61
|
+
Each run produces a report with:
|
|
62
|
+
- All subreddits monitored and time window
|
|
63
|
+
- Each high-signal post: title, URL, upvotes, signal quote, matched keyword, post type
|
|
64
|
+
- A drafted reply for each match (2-5 sentences, mode-appropriate)
|
|
65
|
+
- A list of subreddits that returned 0 results (for tuning)
|
|
66
|
+
|
|
67
|
+
Reports are saved to `docs/reddit-intel/YYYY-MM-DD.md`.
|
|
68
|
+
|
|
69
|
+
## Reply Modes
|
|
70
|
+
|
|
71
|
+
The skill classifies each post and drafts in the appropriate mode:
|
|
72
|
+
|
|
73
|
+
| Mode | Post Type | Can Name Product? |
|
|
74
|
+
|------|-----------|------------------|
|
|
75
|
+
| Mode 1 | Venting / frustration | Never |
|
|
76
|
+
| Mode 2 | "How do you handle X?" | Never |
|
|
77
|
+
| Mode 3 | "What tool does X?" | Yes, with one alternative |
|
|
78
|
+
|
|
79
|
+
## Choosing Good Subreddits
|
|
80
|
+
|
|
81
|
+
**Where to monitor (people describing problems):**
|
|
82
|
+
- r/devops, r/ExperiencedDevs, r/sysadmin: engineers asking operational questions
|
|
83
|
+
- r/startups, r/SaaS, r/EntrepreneurRideAlong: founders and operators venting about scaling
|
|
84
|
+
- r/sales, r/marketing: GTM practitioners asking how others handle things
|
|
85
|
+
|
|
86
|
+
**Where not to monitor:**
|
|
87
|
+
- Topic subreddits (r/programming, r/MachineLearning): discussions, not pain points
|
|
88
|
+
- Your product's own subreddit: not monitoring your own community
|
|
89
|
+
- Broad consumer subreddits: not your B2B ICP
|
|
90
|
+
|
|
91
|
+
## OAuth Upgrade
|
|
92
|
+
|
|
93
|
+
If you need more than 10 RPM (large subreddits or frequent runs):
|
|
94
|
+
|
|
95
|
+
1. Go to reddit.com/prefs/apps and create a "script" app
|
|
96
|
+
2. Note: app approval may take several days as of late 2025
|
|
97
|
+
3. Fill in REDDIT_CLIENT_ID, REDDIT_CLIENT_SECRET, REDDIT_USERNAME, REDDIT_PASSWORD in .env
|
|
98
|
+
|
|
99
|
+
With OAuth, the skill fetches a Bearer token at session start and uses the `oauth.reddit.com` endpoint for 60 RPM.
|
|
100
|
+
|
|
101
|
+
## Project Structure
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
reddit-icp-monitor/
|
|
105
|
+
├── SKILL.md
|
|
106
|
+
├── README.md
|
|
107
|
+
├── .env.example
|
|
108
|
+
├── evals/
|
|
109
|
+
│ └── evals.json
|
|
110
|
+
└── references/
|
|
111
|
+
├── icp-format.md
|
|
112
|
+
└── reply-rules.md
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## License
|
|
116
|
+
|
|
117
|
+
MIT
|