Get the FREE Ultimate OpenClaw Setup Guide →

reddit-cultivate

npx machina-cli add skill PHY041/claude-skill-reddit/reddit-cultivate --openclaw
Files (1)
SKILL.md
8.6 KB

Reddit Cultivation Skill (AppleScript Chrome Control)

Build and maintain Reddit presence by controlling the user's real Chrome browser via AppleScript. No Playwright, no Selenium, no API tokens.


How It Works

Claude Code → osascript → Chrome (real browser, logged in) → Reddit
  • AppleScript executes JavaScript in Chrome's active tab
  • Chrome is already logged into Reddit → cookies sent automatically
  • Same-origin fetch → no CORS, no detection, no IP blocks
  • Reddit cannot distinguish this from human browsing

Prerequisites

  • macOS only (AppleScript is a macOS technology)
  • Chrome: View → Developer → Allow JavaScript from Apple Events ✓ (restart Chrome after enabling)
  • User logged into Reddit in Chrome

Method Detection (Run First)

Chrome multi-profile can cause AppleScript to not see windows. Always detect first:

WINDOWS=$(osascript -e 'tell application "Google Chrome" to return count of windows' 2>/dev/null)
if [ "$WINDOWS" = "0" ] || [ -z "$WINDOWS" ]; then
    echo "Use Method 2 (System Events + Console)"
else
    echo "Use Method 1 (execute javascript)"
fi

Method 1: AppleScript Execute JavaScript (Preferred)

Works when count of windows > 0.

Navigate

osascript -e 'tell application "Google Chrome" to tell active tab of first window to set URL to "https://www.reddit.com/r/SideProject/rising/"'

Execute JS & Read Result (document.title trick)

# Run JS that writes result to document.title
osascript -e 'tell application "Google Chrome" to tell active tab of first window to execute javascript "fetch(\"/api/me.json\",{credentials:\"include\"}).then(r=>r.json()).then(d=>{document.title=\"R:\"+JSON.stringify({name:d.data.name,karma:d.data.total_karma})})"'

# Wait, then read title
sleep 2
osascript -e 'tell application "Google Chrome" to return title of active tab of first window'

JXA for Complex JS (avoids escaping hell)

osascript -l JavaScript -e '
var chrome = Application("Google Chrome");
var tab = chrome.windows[0].activeTab;
tab.execute({javascript: "(" + function() {
    // Complex JS here — no escaping needed
    fetch("/r/SideProject/rising.json?limit=10", {credentials: "include"})
        .then(r => r.json())
        .then(d => {
            var posts = d.data.children.map(p => ({
                title: p.data.title.substring(0, 60),
                score: p.data.score,
                comments: p.data.num_comments,
                id: p.data.name,
                url: "https://reddit.com" + p.data.permalink
            }));
            document.title = "POSTS:" + JSON.stringify(posts);
        });
} + ")();"});
'

Method 2: System Events + Console (Multi-Profile Fallback)

When AppleScript can't see Chrome windows (multi-profile bug), use keyboard automation.

Step 1: Copy JS to Clipboard

python3 -c "
import subprocess
js = '''(async()=>{
    let resp = await fetch('/api/me.json', {credentials: 'include'});
    let data = await resp.json();
    document.title = 'R:' + JSON.stringify({name: data.data.name, karma: data.data.total_karma});
})()'''
subprocess.run(['pbcopy'], input=js.encode(), check=True)
"

Step 2: Execute via Chrome Console Keyboard Shortcuts

osascript -e '
tell application "System Events"
    tell process "Google Chrome"
        set frontmost to true
        delay 0.3
        -- Cmd+Option+J = open/close Console
        key code 38 using {command down, option down}
        delay 1
        -- Select all + Paste + Enter
        keystroke "a" using {command down}
        delay 0.2
        keystroke "v" using {command down}
        delay 0.5
        key code 36
        delay 0.3
        -- Close Console
        key code 38 using {command down, option down}
    end tell
end tell'

Step 3: Read Title via System Events

sleep 3
osascript -e '
tell application "System Events"
    tell process "Google Chrome"
        return name of window 1
    end tell
end tell'

Workflow

Step 1: Check Account Status

Get username, karma, verify login using /api/me.json.

Step 2: Scan Rising Posts

For each target subreddit, fetch rising posts:

/r/{subreddit}/rising.json?limit=10

Look for:

  • Rising posts with < 15 comments (early = more visibility)
  • Score > 2 (some traction)
  • Questions you can answer or discussions with genuine insight

Step 3: Draft Comments

Rules:

  • 2-4 sentences, natural tone
  • Add genuine value (insights, experience, helpful info)
  • No self-promotion, no links, no emojis
  • Match the subreddit's culture
  • Each comment must be unique

Step 4: Post All Comments

Get modhash, then post each comment with 4s delay between posts.

// Get modhash first
let me = await fetch("/api/me.json", {credentials: "include"}).then(r=>r.json());
let uh = me.data.modhash;

// Post comment
let body = new URLSearchParams({
    thing_id: "t3_xxxxx",  // post fullname
    text: "Your comment here",
    uh: uh,
    api_type: "json"
});
let resp = await fetch("/api/comment", {
    method: "POST",
    credentials: "include",
    headers: {"Content-Type": "application/x-www-form-urlencoded"},
    body: body.toString()
});
let result = await resp.json();
document.title = "POSTED:" + JSON.stringify(result);

Extract the comment ID from the response HTML: look for id-t1_XXXXXXX in the result.

Step 5: Session Summary with Links

ALWAYS end with a summary table containing direct links to every comment posted.

The comment link format is:

https://www.reddit.com/r/{subreddit}/comments/{post_id}/comment/{comment_id}/

Where:

  • {subreddit} = the subreddit name
  • {post_id} = the post ID (from thing_id minus the t3_ prefix)
  • {comment_id} = extracted from the POST response (the t1_XXXXXXX value, minus t1_ prefix)

Example summary table:

#SubPostComment Link
1r/SideProject"Post title"https://www.reddit.com/r/SideProject/comments/abc123/comment/xyz789/
2r/ClaudeAI"Post title"https://www.reddit.com/r/ClaudeAI/comments/def456/comment/uvw012/

This lets the user bookmark, follow up on replies, and track which comments got traction.


Recommended Target Subreddits

PrioritySubredditWhy
Highr/SideProjectProject launches, very welcoming
Highr/indiehackersRevenue/growth discussions
Mediumr/ClaudeAIAI tooling audience
Mediumr/coolgithubprojectsOpen source visibility
Mediumr/startupsStartup discussions
Mediumr/entrepreneurBusiness insights
Mediumr/opensourceTechnical audience

Comment Guidelines

  • Add genuine value (insights, experience, helpful info)
  • No self-promotion in comments
  • Match the subreddit's tone
  • Be specific, not generic
  • 2-4 sentences, natural voice

Rate Limiting

ActionLimit
Between API calls2+ seconds
Between posts4+ seconds
Per sessionMax 5 comments
Daily10-15 comments max

Karma Milestones

KarmaUnlocks
100+Can post in most subreddits
500+Reduced spam filter triggers
1000+Trusted contributor status
5000+Community recognition

Algorithm Insights

  • First 30 minutes determine if post reaches Hot page
  • Early upvotes weighted 10x more than later ones
  • 2 early comments > 20 passive upvotes
  • Best posting time: Sunday 6-8 AM ET
  • Upvote ratio matters: 100↑/10↓ (90%) beats 150↑/50↓ (75%)

Troubleshooting

ProblemSolution
count of windows = 0Chrome multi-profile bug → use Method 2
"Allow JavaScript" not workingRestart Chrome after enabling
Modhash expiredRe-fetch from /api/me.json
403 responseRate limited, wait 5+ minutes
Comment not appearingCheck for shadowban: visit profile in incognito

Why AppleScript (Not Playwright/Selenium)

ToolProblem
PlaywrightSets navigator.webdriver=true, detected instantly
SeleniumSame detection issue
PuppeteerSame detection issue
curl + APIIP blocked by Reddit after few requests
AppleScriptControls real Chrome, undetectable, cookies included

Source

git clone https://github.com/PHY041/claude-skill-reddit/blob/main/.claude/skills/reddit-cultivate/SKILL.mdView on GitHub

Overview

Indie developers can build and sustain a Reddit presence by automating actions in a real Chrome session on macOS. The skill checks karma, identifies rising posts, drafts comments, and can post directly without API tokens, using AppleScript to control Chrome without Playwright or Selenium.

How This Skill Works

The workflow runs Claude Code → osascript → Chrome (logged-in) → Reddit. AppleScript executes JavaScript in the active tab to fetch user data and identify rising posts, then crafts and posts comments. It has a primary AppleScript method for direct control and a fallback using System Events + Console when Chrome windows aren’t visible.

When to Use It

  • You want to grow visibility for a new indie project by engaging with Reddit communities.
  • You need to monitor rising posts in target subreddits and quickly surface engagement opportunities.
  • You want to draft and post thoughtful comments in real-time without managing API tokens.
  • You’re on macOS and want to leverage a real Chrome session for authentic activity.
  • You want to trigger automation via chat commands like '/reddit-cultivate' or 'find reddit opportunities'.

Quick Start

  1. Step 1: Ensure macOS, Google Chrome, and is logged into Reddit in your Chrome profile.
  2. Step 2: Trigger the skill via the chat command (e.g., '/reddit-cultivate') to start analysis and drafting.
  3. Step 3: Review drafted comments and posted updates, and adjust cadence to stay within community guidelines.

Best Practices

  • Use it only on accounts you own and manage, and respect subreddit rules and Reddit's terms of service.
  • Avoid spammy or repetitive comments; prioritize genuine, context-aware engagement.
  • Verify your Chrome session is logged into Reddit and monitor karma to guard against rapid declines.
  • Start with low activity and gradually increase to mimic human posting rhythms.
  • Regularly review results and adjust the strategy instead of relying on automation alone.

Example Use Cases

  • An indie developer uses the skill to surface rising posts in niche subreddits and leaves thoughtful comments on relevant threads.
  • A solo creator maintains daily Reddit presence by drafting comments and posting updates tied to a Side Project launch.
  • A project founder automates monitoring of Reddit karma across multiple communities to guide content timing.
  • A maker uses the workflow to engage with early adopters, collecting feedback through comments and replies.
  • A studio uses controlled automation to sustain consistent activity while focusing on high-signal subreddits.

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers