Files
last30days-skill/docs/plans/2026-03-07-feat-paperclip-marketing-automation-plan.md
T
Matt Van Horn 32992834ee Merge PR #48: feat: add Xiaohongshu source + Reddit public fallback
- Xiaohongshu search via local MCP service (opt-in, zero impact if service not running)
- Reddit public JSON fallback (works with zero API keys)
- Reddit priority: ScrapeCreators -> OpenAI -> public fallback
- Updated env.py: Reddit always available via public fallback

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 16:11:35 -08:00

376 lines
14 KiB
Markdown

---
title: "feat: Paperclip Marketing Automation for last30days"
type: feat
status: active
date: 2026-03-07
---
# Paperclip Marketing Automation for last30days
## Overview
Set up a Paperclip "company" that auto-runs marketing for the last30days open-source skill (3,800+ stars). Four agent roles handle daily demo showcases, release announcements, community engagement, and analytics - all using a draft-then-approve workflow through Paperclip's built-in approval gates.
The killer angle: **last30days markets itself by running itself.** The Content Creator agent runs `/last30days [trending topic] --agent` on hot topics daily, then drafts X threads showing the results. Every post is a live demo.
## Problem Statement / Motivation
- All marketing is currently manual - ~60KB of pre-drafted X threads sit in `docs/` unposted
- No automated community monitoring (GitHub issues, contributor shoutouts)
- No metrics tracking (star growth, fork trends, social engagement)
- Solo entrepreneur can't sustain daily content + community management + development
- The tool's best ad is itself running on interesting topics, but that requires daily effort
## Proposed Solution
A Paperclip company called **"last30days Marketing"** with 4 agent roles, all draft-then-approve.
### Company Structure
```
last30days Marketing (Company)
Mission: "Grow last30days to 10K GitHub stars through daily demo content,
release marketing, and community engagement"
Marketing Director (Claude Code agent)
- Sets daily topic priorities
- Reviews draft quality before surfacing to human
- Coordinates cross-agent work
Content Creator (Python script agent)
- Runs last30days on trending topics daily
- Drafts X showcase threads from the results
- Heartbeat: daily at 8 AM PT
Release Manager (Bash + Python agent)
- Watches for new git tags on upstream
- Drafts release announcement threads
- Heartbeat: every 6 hours (tag check is cheap)
Community Manager (Python script agent)
- Monitors GitHub issues/PRs via gh CLI
- Drafts welcome messages for new contributors
- Surfaces popular feature requests
- Heartbeat: every 4 hours
Analytics Analyst (Python script agent)
- Tracks GitHub stars, forks, traffic
- Tracks X engagement (@slashlast30days)
- Generates weekly digest
- Heartbeat: daily at 11 PM PT (collect), weekly Monday 9 AM (digest)
```
### Draft-Then-Approve Flow
```
Agent creates draft
-> Saved to ~/Documents/Last30Days/drafts/{agent}/{date}-{slug}.md
-> Paperclip approval gate triggers
-> Matt reviews in Paperclip UI (approve / reject / edit)
-> On approve: Python script posts to X API via tweepy
-> Audit log records everything
```
## Technical Approach
### Phase 1: Infrastructure (Day 1-2)
Set up Paperclip and external API access.
**Files to create:**
- `marketing/paperclip-config.yaml` - Company definition, org chart, budgets
- `marketing/scripts/post_to_x.py` - X API v2 posting via tweepy (draft queue -> X)
- `marketing/scripts/github_monitor.py` - GitHub event monitoring via gh CLI
- `marketing/scripts/metrics_collector.py` - Star/fork/engagement tracking
- `marketing/.env.example` - Required API keys template
**Setup steps:**
1. Install Paperclip locally:
```bash
git clone https://github.com/paperclipai/paperclip
cd paperclip && pnpm install && pnpm dev
```
2. Get X API v2 credentials (developer.x.com) for @slashlast30days
- Need: API key, API secret, Access token, Access token secret
- Permissions: Read + Write (posting)
3. GitHub token for monitoring (gh auth already configured)
4. Create the company in Paperclip UI at localhost:3100:
- Company name: "last30days Marketing"
- Mission: "Grow last30days to 10K GitHub stars"
- Monthly budget cap: $50 (mostly API token costs)
### Phase 2: Content Creator Pipeline (Day 3-5)
The core marketing engine. Uses last30days to market itself.
**How it works:**
1. **Topic Discovery** - `marketing/scripts/discover_topics.py`
- Scrapes trending topics from: Wikipedia pageviews API, HN front page, Reddit r/all
- Filters for topics that would make compelling demos (tech, culture, sports, geopolitics)
- Outputs ranked topic list to `~/Documents/Last30Days/topics-queue.json`
2. **Research & Draft** - `marketing/scripts/create_showcase.py`
- Picks top topic from queue
- Runs: `python3 scripts/last30days.py "{topic}" --agent --emit=compact --save-dir=~/Documents/Last30Days`
- Reads the saved research output
- Drafts a 1-2 tweet thread in the established style (see Style Guide below)
- Saves draft to `~/Documents/Last30Days/drafts/content/{date}-{slug}.md`
3. **Approval Gate** - Paperclip surfaces draft for review
- Matt approves/edits in Paperclip UI
- On approve: triggers `post_to_x.py` with the draft content
**Style Guide (extracted from existing launch threads):**
```
Format: Stats-first hook + key finding + tool credit
Example (from v2.5 launch):
"/last30days Anthropic Pete Hegseth"
14 Reddit threads. 29 X posts (11,559 likes). 20 YouTube videos (739K views).
5 HN stories. 9 Polymarket markets.
[Key finding in 2-3 sentences]
Polymarket: [relevant odds with specific numbers]
[One-liner showing the tool's value]
github.com/mvanhorn/last30days-skill
```
Rules:
- Always lead with the /last30days command that was run
- Always include the stats line (thread/post/video counts)
- Always end with the GitHub link
- Pick topics people care about RIGHT NOW
- Never use em dashes - use hyphens instead
- Keep threads to 1-2 tweets max for daily showcases
- Save longer threads (3-6 tweets) for releases
### Phase 3: Release Manager Pipeline (Day 5-6)
**How it works:**
1. **Tag Watcher** - `marketing/scripts/watch_releases.py`
- Runs `git -C /Users/mvanhorn/last30days-skill-private fetch upstream --tags` every 6 hours
- Compares local tags vs upstream tags
- On new tag: reads CHANGELOG.md diff since last tag
2. **Thread Drafter** - `marketing/scripts/draft_release_thread.py`
- Reads changelog diff + release-notes.md
- Drafts a 3-6 tweet thread following the v2.5 launch thread style
- Includes: version number, headline features, demo queries, contributor shoutouts
- Saves to `~/Documents/Last30Days/drafts/releases/{tag}.md`
3. **Approval Gate** - Same flow as content pipeline
**Template (from existing docs/v2.5-launch-tweets.md):**
```
Tweet 1: Announcement + 3 headline features + GitHub link
Tweet 2-4: One demo per tweet (command + stats + finding)
Tweet 5: Contributor shoutouts
Tweet 6: Install instructions
```
### Phase 4: Community Manager Pipeline (Day 6-7)
**How it works:**
1. **GitHub Monitor** - `marketing/scripts/github_monitor.py`
- Runs `gh issue list --repo mvanhorn/last30days-skill --state open --json number,title,author,createdAt,labels`
- Runs `gh pr list --repo mvanhorn/last30days-skill --state open --json number,title,author,createdAt`
- Compares against `~/Documents/Last30Days/community/seen.json` to detect new items
- Categorizes: bug report, feature request, question, PR
2. **Response Drafter** - `marketing/scripts/draft_community_response.py`
- For new issues: drafts a welcome + triage response
- For new PRs: drafts a thank-you + initial review comment
- For merged PRs: drafts a contributor shoutout tweet
- Saves to `~/Documents/Last30Days/drafts/community/{type}-{number}.md`
3. **Approval Gate** - GitHub responses go through same Paperclip approval
- Approved responses posted via `gh issue comment` or `gh pr comment`
- Shoutout tweets posted via `post_to_x.py`
**Response templates:**
```markdown
# New Issue (bug)
Thanks for the report! I'll look into this. Can you share:
- Your OS and Python version
- The exact command you ran
- Whether you have SCRAPECREATORS_API_KEY set
# New Issue (feature request)
Interesting idea! [1-2 sentences acknowledging the value].
Adding this to the backlog for consideration.
# New PR
Thanks for the contribution, @{author}! I'll review this shortly.
[If first-time contributor: Welcome to the project!]
# Merged PR (tweet)
Shoutout to @{author} for [what they did] in last30days v{version}!
[Brief description of the change and why it matters]
github.com/mvanhorn/last30days-skill/pull/{number}
```
### Phase 5: Analytics Pipeline (Day 7-8)
**How it works:**
1. **Metrics Collector** - `marketing/scripts/metrics_collector.py`
- Daily: GitHub stars, forks, open issues, open PRs (via `gh api`)
- Daily: X followers, tweet impressions for @slashlast30days (via X API v2)
- Stores in SQLite at `~/Documents/Last30Days/analytics.db`
2. **Weekly Digest** - `marketing/scripts/weekly_digest.py`
- Runs Monday 9 AM PT
- Generates markdown report with week-over-week changes:
- Star growth (absolute + rate)
- New forks
- Issues opened/closed
- PRs merged
- Top-performing tweets
- Notable community interactions
- Saves to `~/Documents/Last30Days/digests/{date}-weekly.md`
- Optionally sends via email (SendGrid) or Slack webhook
**Schema for analytics.db:**
```sql
CREATE TABLE daily_metrics (
date TEXT PRIMARY KEY,
github_stars INTEGER,
github_forks INTEGER,
github_open_issues INTEGER,
github_open_prs INTEGER,
x_followers INTEGER,
x_impressions INTEGER,
x_engagement_rate REAL
);
CREATE TABLE tweet_performance (
tweet_id TEXT PRIMARY KEY,
posted_at TEXT,
type TEXT, -- 'showcase', 'release', 'shoutout'
topic TEXT,
impressions INTEGER,
likes INTEGER,
retweets INTEGER,
replies INTEGER,
link_clicks INTEGER
);
```
## Technical Considerations
### API Costs
| Service | Usage | Est. Monthly Cost |
|---------|-------|-------------------|
| Paperclip | Self-hosted | $0 |
| X API v2 | Free tier (posting) | $0 |
| ScrapeCreators | ~30 daily research runs | ~$15 |
| GitHub API | gh CLI, already authed | $0 |
| Claude API | Marketing Director agent | ~$20 |
| **Total** | | **~$35/month** |
### Security
- API keys stored in `marketing/.env` (gitignored, never committed)
- X API tokens scoped to @slashlast30days only (not personal account)
- Paperclip budget cap prevents runaway spend
- All posts go through human approval gate - no autonomous posting
- GitHub token uses existing `gh auth` session
### Failure Modes
- **last30days script fails** - Content Creator skips that day, logs error, tries again tomorrow with new topic
- **X API rate limit** - Queue drafts and retry on next heartbeat cycle
- **Paperclip goes down** - Drafts accumulate in filesystem, nothing posts (safe failure)
- **Bad topic selection** - Marketing Director agent filters topics before research (no politics, no NSFW)
- **Stale approval queue** - If drafts pile up >3 days unapproved, send a nudge notification
### Topic Selection Criteria
The discover_topics.py script should filter for topics that:
1. Are trending NOW (Wikipedia pageview spike, HN front page, Reddit r/all)
2. Would produce interesting multi-source results (not too niche, not too broad)
3. Are safe for a developer tool brand (tech, sports, culture, science - avoid divisive politics)
4. Haven't been covered in the last 7 days (dedup against previous showcases)
5. Span different categories to show the tool's versatility (not all tech, not all sports)
Good examples (from existing launch threads): "Anthropic Pete Hegseth", "Seedance prompting", "Arizona basketball", "Iran war"
## Acceptance Criteria
- [ ] Paperclip running locally with "last30days Marketing" company created
- [ ] Content Creator agent runs last30days daily on a trending topic and produces a draft
- [ ] Release Manager agent detects new git tags and drafts announcement threads
- [ ] Community Manager agent detects new GitHub issues/PRs and drafts responses
- [ ] Analytics agent collects daily metrics and generates weekly digest
- [ ] All drafts go through Paperclip approval gate before posting
- [ ] X API integration posts approved drafts to @slashlast30days
- [ ] GitHub responses posted via gh CLI after approval
- [ ] Monthly budget stays under $50
- [ ] Style of generated tweets matches existing launch thread tone
## Success Metrics
- **Content velocity**: 5-7 showcase tweets/week (up from ~0 currently)
- **Star growth**: Track week-over-week acceleration after content starts
- **Time savings**: <5 min/day reviewing drafts vs 30-60 min/day manual marketing
- **Content quality**: Drafts require minimal editing before approval (>80% approved as-is within 2 weeks)
## Dependencies & Risks
| Dependency | Risk | Mitigation |
|-----------|------|------------|
| Paperclip stability | Early-stage project, may have bugs | Pin to specific commit, keep simple config |
| X API free tier | May get rate-limited or deprecated | Queue-based posting, daily limits |
| Topic discovery quality | Bad topics = bad demos | Human review in approval gate, topic blocklist |
| Claude API for Marketing Director | Cost could spike | Budget cap in Paperclip, simple prompts |
| ScrapeCreators API | PAYG costs scale with usage | Cap at 1 research run/day for showcases |
## File Structure
```
last30days-skill-private/
marketing/
README.md # Setup instructions
.env.example # Required API keys
paperclip-config.yaml # Company definition
scripts/
discover_topics.py # Trending topic discovery
create_showcase.py # Research + draft showcase tweet
draft_release_thread.py # Release announcement drafter
github_monitor.py # GitHub issue/PR monitor
draft_community_response.py # Community response drafter
post_to_x.py # X API posting (after approval)
metrics_collector.py # Daily metrics collection
weekly_digest.py # Weekly analytics digest
templates/
showcase.md # Tweet template for daily demos
release.md # Thread template for releases
community_responses.md # Response templates by type
```
## Sources & References
- Paperclip GitHub: github.com/paperclipai/paperclip
- Paperclip docs: paperclip.ing
- Existing launch threads: `docs/v2.5-launch-tweets.md`, `docs/v2.1-tweets.md`
- Existing launch copy: `docs/v2.1-launch-copy.md`
- Planned Last30Days.com: `docs/plans/2026-02-20-feat-last30days-com-trending-topics-plan.md`
- last30days `--agent` mode: SKILL.md line 115-142 (non-interactive output for automation)