- 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>
14 KiB
title, type, status, date
| title | type | status | date |
|---|---|---|---|
| feat: Paperclip Marketing Automation for last30days | feat | active | 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, budgetsmarketing/scripts/post_to_x.py- X API v2 posting via tweepy (draft queue -> X)marketing/scripts/github_monitor.py- GitHub event monitoring via gh CLImarketing/scripts/metrics_collector.py- Star/fork/engagement trackingmarketing/.env.example- Required API keys template
Setup steps:
-
Install Paperclip locally:
git clone https://github.com/paperclipai/paperclip cd paperclip && pnpm install && pnpm dev -
Get X API v2 credentials (developer.x.com) for @slashlast30days
- Need: API key, API secret, Access token, Access token secret
- Permissions: Read + Write (posting)
-
GitHub token for monitoring (gh auth already configured)
-
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:
-
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
-
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
-
Approval Gate - Paperclip surfaces draft for review
- Matt approves/edits in Paperclip UI
- On approve: triggers
post_to_x.pywith 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:
-
Tag Watcher -
marketing/scripts/watch_releases.py- Runs
git -C /Users/mvanhorn/last30days-skill-private fetch upstream --tagsevery 6 hours - Compares local tags vs upstream tags
- On new tag: reads CHANGELOG.md diff since last tag
- Runs
-
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
-
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:
-
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.jsonto detect new items - Categorizes: bug report, feature request, question, PR
- Runs
-
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
-
Approval Gate - GitHub responses go through same Paperclip approval
- Approved responses posted via
gh issue commentorgh pr comment - Shoutout tweets posted via
post_to_x.py
- Approved responses posted via
Response templates:
# 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:
-
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
- Daily: GitHub stars, forks, open issues, open PRs (via
-
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:
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 authsession
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:
- Are trending NOW (Wikipedia pageview spike, HN front page, Reddit r/all)
- Would produce interesting multi-source results (not too niche, not too broad)
- Are safe for a developer tool brand (tech, sports, culture, science - avoid divisive politics)
- Haven't been covered in the last 7 days (dedup against previous showcases)
- 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
--agentmode: SKILL.md line 115-142 (non-interactive output for automation)