A Claude Code skill that runs every morning, fetches what's trending, scores trends against your niches, and drops ready-to-post copy for Instagram, LinkedIn, TikTok, and X into Notion.
Built on the same architecture as trendvane — same trend pipeline, different output: real platform-native post copy instead of video briefs.
- Instagram — full caption with hook, body, CTA + 20–30 hashtags for first comment
- LinkedIn — professional post, value-first opening, discussion CTA, 3–5 hashtags
- TikTok — text overlay (≤10 words), display caption, full caption, audio direction, hashtags
- X — single tweet (≤280 chars) or numbered thread (2–7 tweets)
- Trend Intel — what it is, why it scored, source URLs
All 12 posts are voice-audited against your examples before pushing to Notion.
# Recommended
npx skills add your-username/ripple -g -a claude-code
# Manual
git clone https://github.com/your-username/ripple
cd ripple
python3 setup.pyThen open Claude Code and type /ripple for the guided setup.
When you run /ripple for the first time, Claude walks you through:
- Notion — creates your Ripple database and collects workspace/database IDs
- Niches — you define 2–5 niches with keywords, weights, and optional subreddits
- Voice profile — you paste 2–3 example posts per platform; Claude matches your voice
- API keys — optional: YouTube, Reddit, Product Hunt (Ripple works without them)
After setup, run /ripple any time.
| Source | Auth required | Notes |
|---|---|---|
| HackerNews | None | Always available |
| Optional (app OAuth) | Falls back to public JSON | |
| Google Trends | None | Requires pytrends |
| YouTube | Optional (API key) | Skipped if no key |
| Product Hunt | Optional (token) | Skipped if no token |
| TikTok | None | May be blocked; degrades gracefully |
Each trend is scored 0–100 across 5 dimensions:
| Dimension | Default weight |
|---|---|
| Niche fit | 40% |
| Velocity (rising > peaking > fading) | 25% |
| Cross-platform presence | 15% |
| Recency (7-day decay) | 10% |
| Originality (30-day dedup) | 10% |
Weights are overridable in my_niches.json. At least 1 of the 3 daily picks always comes from your highest-weighted niche.
All user config lives in ~/.claude/ripple/ and is never overwritten by updates.
| File | Purpose |
|---|---|
my_niches.json |
Niche definitions, keywords, weights, subreddits, scoring weights |
voice_examples.md |
Your example posts per platform — Claude matches this voice |
notion_config.json |
Notion workspace ID and database ID |
secrets.json |
Optional API keys |
used_angles.json |
14-day content angle history (prevents repetition) |
Your Ripple database needs these properties:
| Property | Type |
|---|---|
| Name | Title |
| Date | Date |
| Score | Number |
| Velocity | Select: rising / peaking / fading |
| Niche | Select |
| Sources | Multi-select |
| Time to Stale | Number |
| Status | Select: Draft / Reviewed / Posted |
Each page body contains: IG → LinkedIn → TikTok → X → Trend Intel.
On demand:
/ripple
Or: "what should I post today?" inside Claude Code.
Scheduled (daily):
# 5:30am fetch + 6:00am generate
# Set up via cron or the Claude Code /schedule skillScore only (skip fetch):
python3 ~/.claude/skills/ripple/scripts/run_all.py --scoreBefore pushing to Notion, Claude re-reads all 12 posts and checks:
- Zero AI-tell phrases (delve, leverage, game-changing, etc.)
- Matches your voice_examples.md patterns
- Per-platform format rules (char limits, hook placement, hashtag counts)
- No brand-unsafe content (politics, alcohol, gambling, explicit, competitor attacks)
- Claude Code (
npm install -g @anthropic-ai/claude-codeor claude.ai/code) - Notion MCP configured in Claude Code
- Python 3.10+
- Notion workspace with a Ripple database
ripple/
├── .claude-plugin/plugin.json
├── .github/workflows/ci.yml
├── skills/ripple/
│ ├── SKILL.md # Full workflow — what Claude reads
│ ├── requirements.txt
│ ├── references/setup_guide.md # Step-by-step first-run flow
│ ├── scripts/
│ │ ├── common.py # Shared utils, TrendCandidate class
│ │ ├── run_all.py # Orchestrator: fetch + score
│ │ ├── score_trends.py # Scoring + clustering engine
│ │ ├── validate_setup.py # Pre-flight config check
│ │ ├── fetch_hackernews.py
│ │ ├── fetch_reddit.py
│ │ ├── fetch_google_trends.py
│ │ ├── fetch_youtube.py
│ │ ├── fetch_producthunt.py
│ │ ├── fetch_tiktok.py
│ │ └── push_to_notion.py # Notion schema reference
│ ├── templates/
│ │ ├── post_template.md # Output format for all 4 platforms
│ │ └── platform_rules.md # Per-platform constraints
│ ├── memory/ # Shipped defaults (read-only)
│ │ ├── my_niches.json
│ │ ├── voice_examples.md
│ │ ├── notion_config.example.json
│ │ ├── secrets.example.json
│ │ └── used_angles.json
│ └── tests/test_scoring.py
├── README.md
├── setup.py
├── pyproject.toml
└── requirements.txt
# Lint
ruff check skills/ripple/scripts skills/ripple/tests
# Fix
ruff check --fix skills/ripple/scripts
# Test
python3 -m unittest discover -s skills/ripple/tests -vMIT